Browse Source

2020 10/26 数据库通信

wk 4 years ago
parent
commit
4f9a2d27f2

+ 9 - 10
CMakeLists.txt

@@ -3,11 +3,11 @@ project(nnxx_tests)
 cmake_minimum_required(VERSION 3.5)
 
 set (CMAKE_CXX_STANDARD 11)
-set(PCL_DIR "/home/youchen/pcl-1.8/share/pcl-1.8")
+#set(PCL_DIR "/home/youchen/pcl-1.8/share/pcl-1.8")
 find_package(PkgConfig REQUIRED)
 pkg_check_modules(nanomsg REQUIRED nanomsg)
 FIND_PACKAGE(Protobuf REQUIRED)
-FIND_PACKAGE(Glog REQUIRED)
+#FIND_PACKAGE(Glog REQUIRED)
 FIND_PACKAGE(OpenCV REQUIRED)
 FIND_PACKAGE(PCL REQUIRED)
 
@@ -16,13 +16,10 @@ include_directories(
         ${PCL_INCLUDE_DIRS}
         ${OpenCV_INCLUDE_DIRS}
         ${PROTOBUF_INCLUDE_DIRS}
-        laser
-        Locate
         communication
         message
         error_code
         tool
-        system
         parkspace_allocation
         /usr/local/include/cppconn/
 )
@@ -32,16 +29,11 @@ message(STATUS ${EXECUTABLE_OUTPUT_PATH})
 
 aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/error_code error_src )
 aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/message message_src )
-aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/lidar_locate locate_src )
 #aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/robot robot_src )
-aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/laser LASER_SRC )
 #aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/plc PLC_SRC )
-aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/locate LOCATE_SRC )
-aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/terminor TERMINOR_SRC )
 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}/parkspace_allocation PARKSPACE_ALLOC_SRC )
 
 # 车位分配测试
@@ -82,8 +74,15 @@ add_executable(db_test
         ./parkspace_allocation/database_controller.cpp
         ${error_src}
         ${TOOL_SRC}
+        ${PARKSPACE_ALLOC_SRC}
+        ${message_src}
+        ${COMMUNICATION_SRC}
         )
 target_link_libraries(db_test
+
+        nnxx
+        nanomsg
+
         ${PROTOBUF_LIBRARIES}
         /usr/local/lib/libglog.a
         /usr/local/lib/libgflags.a

+ 1 - 1
message/parkspace_allocation_message.pb.h

@@ -118,7 +118,7 @@ extern Parkspace_search_response_msgDefaultTypeInternal _Parkspace_search_respon
 namespace message {
 
 enum Vehicle_status {
-  eVehicle_idle = 0,
+  eVehicle_idle = 0,    //
   eVehicle_in_garage = 1,
   eVehicle_parking = 2,
   eVehicle_fetching = 3,

+ 1 - 1
message/parkspace_allocation_message.proto

@@ -97,7 +97,7 @@ message Parkspace_confirm_alloc_request_msg
     required Command_info               command_info=2;           //指令唯一标识符id
     required Parkspace_info             confirm_space_info=3;    //已修改后的车位信息
 }
-
+//确定占用车位
 message Parkspace_confirm_alloc_response_msg
 {
     required Base_info                  base_info=1;            //消息类型

+ 4 - 2
parkspace_allocation/database_controller.cpp

@@ -38,7 +38,7 @@ Error_manager Database_controller::database_controller_init(std::string ip, int
     {
         mb_connected = true;
     }else{
-        mb_connected = false;
+		mb_connected = false;
     }
 
     return SUCCESS;
@@ -336,7 +336,9 @@ Error_manager Database_controller::check_status()
         }
     }
     if(mb_connected)
-        return SUCCESS;
+	{
+		return SUCCESS;
+	}
     else
         return DB_CONNECT_FAILED;
 }

+ 6 - 8
parkspace_allocation/database_controller.h

@@ -32,10 +32,8 @@
 
 #define DB_UPDATE_INTERVAL_MILLI 20000 
 
-class Database_controller : public Singleton<Database_controller>
+class Database_controller
 {
-    // 子类必须把父类设定为友元函数,这样父类才能使用子类的私有构造函数。
-    friend class Singleton<Database_controller>;
 public:
     typedef struct DB_PARAM
     {
@@ -44,10 +42,11 @@ public:
         std::string pass;
         std::string db_name;
     } db_param;
-
+	// 父类的构造函数必须保护,子类的构造函数必须私有。
+	Database_controller() = default;
     // 必须关闭拷贝构造和赋值构造,只能通过 get_instance 函数来进行操作唯一的实例。
-    Database_controller(const Database_controller &) = delete;
-    Database_controller &operator=(const Database_controller &) = delete;
+    Database_controller(const Database_controller &) = default;
+    Database_controller &operator=(const Database_controller &) = default;
     ~Database_controller() = default;
 
     //初始化
@@ -67,8 +66,7 @@ public:
     Error_manager sql_query(std::string sql_str, boost::shared_ptr< sql::ResultSet > &query_result);
 
 private:
-    // 父类的构造函数必须保护,子类的构造函数必须私有。
-    Database_controller() = default;
+
     // 守护线程,维持连接数量,以及自身状态更新
     void database_status_update();
     // 检查连接状态

+ 36 - 51
parkspace_allocation/parkspace_allocation_communicator.cpp

@@ -4,6 +4,7 @@
 
 Parkspace_allocation_communicator::Parkspace_allocation_communicator()
 {
+
 }
 
 Parkspace_allocation_communicator::~Parkspace_allocation_communicator()
@@ -17,33 +18,8 @@ Error_manager Parkspace_allocation_communicator::send_response(Communication_mes
     return encapsulate_msg(message);
 }
 
-//外部调用更新所有车位信息/初始化所有车位
-Error_manager Parkspace_allocation_communicator::update_parkspace_status(message::Parkspace_allocation_status_msg status_msg)
-{
-    std::lock_guard<std::mutex> lck(m_status_mutex);
-    m_parkspace_status_msg.CopyFrom(status_msg);
-    return SUCCESS;
-}
 
-//外部调用更新单一车位信息
-Error_manager Parkspace_allocation_communicator::update_parkspace_status(int parkspace_id, message::Parkspace_info parkspace_info)
-{
-    std::lock_guard<std::mutex> lck(m_status_mutex);
-    if(m_parkspace_status_msg.parkspace_info_size() > parkspace_id)
-    {
-        m_parkspace_status_msg.mutable_parkspace_info(parkspace_id)->CopyFrom(parkspace_info);
-    }
-    return SUCCESS;
-}
 
-//外部调用获取当前车位状态消息
-message::Parkspace_allocation_status_msg Parkspace_allocation_communicator::get_status()
-{
-    std::lock_guard<std::mutex> lck(m_status_mutex);
-    message::Parkspace_allocation_status_msg parkspace_status_msg;
-    parkspace_status_msg.CopyFrom(m_parkspace_status_msg);
-    return parkspace_status_msg;
-}
 
 //************************************* 内部函数 ****************************************
 //封装反馈消息自动发送
@@ -140,34 +116,43 @@ Error_manager Parkspace_allocation_communicator::check_executer(Communication_me
 	return Error_code::SUCCESS;
 }
 
-//重载心跳与车位状态发送函数
-Error_manager Parkspace_allocation_communicator::encapsulate_send_data()
+class AAA
 {
-    // return Error_code::SUCCESS;
-    std::lock_guard<std::mutex> lck(m_status_mutex);
-    //车位信息消息赋值
-	message::Parkspace_allocation_status_msg t_parkspace_status_msg;
-    t_parkspace_status_msg.CopyFrom(m_parkspace_status_msg);
-    message::Base_info t_base_info;
-    message::Error_manager t_error;
-	t_base_info.set_msg_type(message::Message_type::eParkspace_allocation_status_msg);
-	t_base_info.set_timeout_ms(5000);
-	t_base_info.set_sender(message::Communicator::eParkspace);
-	t_base_info.set_receiver(message::Communicator::eMain);
-    t_error.set_error_code(0);
-    t_parkspace_status_msg.mutable_base_info()->CopyFrom(t_base_info);
-    t_parkspace_status_msg.mutable_error_manager()->CopyFrom(t_error);
-
-	Communication_message* tp_msg = new Communication_message(t_parkspace_status_msg.SerializeAsString());
-    //重置消息,填入头信息
-    tp_msg->reset(t_base_info, tp_msg->get_message_buf());
-	bool is_push = m_send_data_list.push(tp_msg);
-	if ( is_push == false )
+public:
+	message::Parkspace_allocation_status_msg mmm;
+
+	message::Parkspace_allocation_status_msg & get()
 	{
-		delete(tp_msg);
-		tp_msg = NULL;
-		return Error_manager(Error_code::CONTAINER_IS_TERMINATE, Error_level::MINOR_ERROR,
-							 " Parkspace_allocation_communicator::send status error ");
+		return mmm;
 	}
+};
+
+
+//重载心跳与车位状态发送函数
+Error_manager Parkspace_allocation_communicator::encapsulate_send_data()
+{
+//	AAA aaa;
+//	message::Parkspace_allocation_status_msg &     m_parkspace_status_msg3 = aaa.get();
+//	std::string str3;
+//	m_parkspace_status_msg3.SerializeToString(&str3);
+//
+//	return Error_code::SUCCESS;
+
+//	message::Parkspace_allocation_status_msg      m_parkspace_status_msg;
+//	Communication_socket_base::encapsulate_msg(m_parkspace_status_msg.SerializeAsString());
+//	return Error_code::SUCCESS;
+
+
+	Parkspace_allocator & parkspace_allocator = Parkspace_allocator::get_instance_references();
+	message::Parkspace_allocation_status_msg &     m_parkspace_status_msg2 = parkspace_allocator.get_parkspace_status_msg();
+	std::string str;
+	m_parkspace_status_msg2.SerializeToString(&str);
+//	Communication_socket_base::encapsulate_msg(str);
+return Error_code::SUCCESS;
+
+
+
+    std::lock_guard<std::mutex> lck(Parkspace_allocator::get_instance_references().get_status_mutex());
+	Communication_socket_base::encapsulate_msg( Parkspace_allocator::get_instance_references().get_parkspace_status_msg().SerializeAsString() );
 	return Error_code::SUCCESS;
 }

+ 0 - 8
parkspace_allocation/parkspace_allocation_communicator.h

@@ -19,12 +19,6 @@ public:
     virtual ~Parkspace_allocation_communicator();
     //外部调用,反馈结果消息
     Error_manager send_response(Communication_message* message);
-    //更新所有车位状态,现有状态将被全部覆盖,车位数量可能变动
-    Error_manager update_parkspace_status(message::Parkspace_allocation_status_msg message);
-    //更新某个车位状态,不修改车位数量,车位按编号从0开始
-    Error_manager update_parkspace_status(int parkspace_id, message::Parkspace_info parkspace_info);
-    //获取所有车位状态
-    message::Parkspace_allocation_status_msg get_status();
 
 protected:
     Parkspace_allocation_communicator();
@@ -40,8 +34,6 @@ protected:
     virtual Error_manager encapsulate_send_data();
 
 protected:
-    message::Parkspace_allocation_status_msg                                m_parkspace_status_msg;
-    std::mutex                                                              m_status_mutex;
 };
 
 

+ 100 - 39
parkspace_allocation/parkspace_allocator.cpp

@@ -11,6 +11,27 @@
 
 Parkspace_allocator::Parkspace_allocator()
 {
+
+	//车位信息消息赋值
+	m_parkspace_status_msg.mutable_base_info()->set_msg_type(message::Message_type::eParkspace_allocation_status_msg);
+	m_parkspace_status_msg.mutable_base_info()->set_timeout_ms(5000);
+	m_parkspace_status_msg.mutable_base_info()->set_sender(message::Communicator::eParkspace);
+	m_parkspace_status_msg.mutable_base_info()->set_receiver(message::Communicator::eMain);
+
+//	//创建一条答复消息
+//	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_key(command_key);
+//	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());
+//	m_parkspace_status_msg.mutable_error_manager()->set_error_description(NULL, 7);
+//
+//	std::string t_msg = t_dispatch_response_msg.SerializeAsString();
+//	System_communication::get_instance_references().encapsulate_msg(t_msg);
 }
 
 Parkspace_allocator::~Parkspace_allocator()
@@ -21,6 +42,7 @@ Parkspace_allocator::~Parkspace_allocator()
 //初始化
 Error_manager Parkspace_allocator::parkspace_allocator_init(int threads_size, parkspace_proto::garage_config config)
 {
+
     // 初始化db连接
     mp_db_manager = Parkspace_db_manager::get_instance_pointer();
     if(mp_db_manager == nullptr)
@@ -33,16 +55,20 @@ Error_manager Parkspace_allocator::parkspace_allocator_init(int threads_size, pa
     {
         return ec;
     }
+
     // 初始化任务处理线程池
 	m_thread_pool.thread_pool_init(threads_size);
+
     // 读数据库车位数据,初始化车位管理
-    message::Parkspace_allocation_status_msg all_parkspace_info;
-    ec = mp_db_manager->get_all_parkspace_info(all_parkspace_info);
+	{
+		std::lock_guard<std::mutex> lck(m_status_mutex);
+		ec = mp_db_manager->get_all_parkspace_info(m_parkspace_status_msg);
+	}
+
     if(ec != SUCCESS)
     {
         return ec;
     }
-    Parkspace_allocation_communicator::get_instance_references().update_parkspace_status(all_parkspace_info);
 	m_current_status = eParkspace_allocator_normal;
 	return Error_code::SUCCESS;
 }
@@ -55,6 +81,32 @@ Error_manager Parkspace_allocator::parkspace_allocator_uninit()
 	m_current_status = eParkspace_allocator_unknown;
 	return Error_code::SUCCESS;
 }
+//外部调用更新所有车位信息/初始化所有车位
+Error_manager Parkspace_allocator::update_parkspace_status(message::Parkspace_allocation_status_msg status_msg)
+{
+	std::lock_guard<std::mutex> lck(m_status_mutex);
+	m_parkspace_status_msg.CopyFrom(status_msg);
+	return SUCCESS;
+}
+
+//外部调用更新单一车位信息
+Error_manager Parkspace_allocator::update_parkspace_status(int parkspace_id, message::Parkspace_info parkspace_info)
+{
+	std::lock_guard<std::mutex> lck(m_status_mutex);
+	if(m_parkspace_status_msg.parkspace_info_size() > parkspace_id)
+	{
+		m_parkspace_status_msg.mutable_parkspace_info(parkspace_id)->CopyFrom(parkspace_info);
+	}
+	return SUCCESS;
+}
+//外部调用获取当前车位状态消息
+message::Parkspace_allocation_status_msg Parkspace_allocator::get_status()
+{
+	std::lock_guard<std::mutex> lck(m_status_mutex);
+	message::Parkspace_allocation_status_msg parkspace_status_msg;
+	parkspace_status_msg.CopyFrom(m_parkspace_status_msg);
+	return parkspace_status_msg;
+}
 
 //检查执行者的状态, 判断能否处理这条消息,
 Error_manager Parkspace_allocator::check_executer(Communication_message* p_msg)
@@ -177,7 +229,14 @@ Parkspace_allocator::parkspace_allocator_status Parkspace_allocator::get_parkspa
 {
 	return m_current_status;
 }
-
+message::Parkspace_allocation_status_msg& Parkspace_allocator::get_parkspace_status_msg()
+{
+	return m_parkspace_status_msg;
+}
+std::mutex& Parkspace_allocator::get_status_mutex()
+{
+	return m_status_mutex;
+}
 // 检查车辆是否已存在,通常分配前调用
 bool Parkspace_allocator::check_car_existence(std::string license, message::Parkspace_allocation_status_msg status_msg)
 {
@@ -235,15 +294,15 @@ void Parkspace_allocator::execute_for_allocate(message::Car_info car_info, int t
     message::Error_manager t_error;
     message::Parkspace_info t_allocated_space;
     //获取当前所有车位状态,分配车位
-    message::Parkspace_allocation_status_msg t_current_parkspace_status = Parkspace_allocation_communicator::get_instance_references().get_status();
+//    message::Parkspace_allocation_status_msg t_current_parkspace_status =  get_status();
     int index = -1;
-    if(t_current_parkspace_status.parkspace_info_size()<=0)
+    if(m_parkspace_status_msg.parkspace_info_size()<=0)
     {
         t_error.set_error_code(PARKSPACE_ALLOCATOR_SPACE_EMPTY);
         t_error.set_error_level(message::Error_level::MAJOR_ERROR);
         LOG(ERROR) << "无车位";
     }
-    else if(check_car_existence(car_info.license(), t_current_parkspace_status))
+    else if(check_car_existence(car_info.license(), m_parkspace_status_msg))
     {
         t_error.set_error_code(PARKSPACE_ALLOCATOR_CAR_ALREADY_EXIST);
         t_error.set_error_level(message::Error_level::MAJOR_ERROR);
@@ -251,23 +310,23 @@ void Parkspace_allocator::execute_for_allocate(message::Car_info car_info, int t
     }
     else
     {   
-        index = allocate_parkspace(t_current_parkspace_status, car_info, terminal_id);
+        index = allocate_parkspace(m_parkspace_status_msg, car_info, terminal_id);
 
         if(index<0){
             t_error.set_error_code(PARKSPACE_ALLOCATOR_ALLOCATE_FAILED);
             t_error.set_error_level(message::Error_level::MAJOR_ERROR);
-            t_allocated_space.CopyFrom(t_current_parkspace_status.parkspace_info(0));
+            t_allocated_space.CopyFrom(m_parkspace_status_msg.parkspace_info(0));
             t_allocated_space.mutable_car_info()->CopyFrom(car_info);
             LOG(WARNING) << "分配车位失败";
         }else{
             t_error.set_error_code(SUCCESS);
             t_error.set_error_level(message::Error_level::NORMAL);
-            message::Parkspace_info t_space_to_lock = t_current_parkspace_status.parkspace_info(index);
+            message::Parkspace_info t_space_to_lock = m_parkspace_status_msg.parkspace_info(index);
             t_space_to_lock.set_parkspace_status(message::Parkspace_status::eParkspace_locked);
             t_space_to_lock.mutable_car_info()->CopyFrom(car_info);
             t_allocated_space.CopyFrom(t_space_to_lock);
             // 分配车位后更新车位状态
-            Parkspace_allocation_communicator::get_instance_references().update_parkspace_status(index, t_space_to_lock);
+			 update_parkspace_status(index, t_space_to_lock);
             LOG(INFO) << "第"<<index<<"号位占用, id: "<<t_space_to_lock.parkspace_id()<<", 号牌: "<<t_space_to_lock.car_info().license();
             // 数据库操作,修改车位状态为锁定,车辆状态为停车中
             message::Vehicle_status t_vehicle_status = message::Vehicle_status::eVehicle_parking;
@@ -307,9 +366,9 @@ void Parkspace_allocator::execute_for_search(message::Car_info car_info, message
     t_response_header.set_sender(message::Communicator::eParkspace);
     t_response_header.set_receiver(message::Communicator::eMain);
     //获取当前所有车位状态,查询车辆位置
-    message::Parkspace_allocation_status_msg t_current_parkspace_status = Parkspace_allocation_communicator::get_instance_references().get_status();
+//    message::Parkspace_allocation_status_msg t_current_parkspace_status =  get_status();
     int index = -1;
-    if(t_current_parkspace_status.parkspace_info_size()<=0)
+    if(m_parkspace_status_msg.parkspace_info_size()<=0)
     {
         t_error.set_error_code(PARKSPACE_ALLOCATOR_SPACE_EMPTY);
         t_error.set_error_level(message::Error_level::MAJOR_ERROR);
@@ -317,12 +376,12 @@ void Parkspace_allocator::execute_for_search(message::Car_info car_info, message
     }
     else
     {
-        for (size_t i = 0; i < t_current_parkspace_status.parkspace_info_size(); i++)
+        for (size_t i = 0; i < m_parkspace_status_msg.parkspace_info_size(); i++)
         {
             // 找到凭证号/号牌对应车位,记录
-            if (t_current_parkspace_status.parkspace_info(i).has_car_info() 
-            && t_current_parkspace_status.parkspace_info(i).car_info().license() == car_info.license() 
-            && t_current_parkspace_status.parkspace_info(i).parkspace_status() == message::Parkspace_status::eParkspace_occupied)
+            if (m_parkspace_status_msg.parkspace_info(i).has_car_info()
+            && m_parkspace_status_msg.parkspace_info(i).car_info().license() == car_info.license()
+            && m_parkspace_status_msg.parkspace_info(i).parkspace_status() == message::Parkspace_status::eParkspace_occupied)
             {
                 index = i;
                 break;
@@ -332,12 +391,12 @@ void Parkspace_allocator::execute_for_search(message::Car_info car_info, message
             t_error.set_error_code(PARKSPACE_ALLOCATOR_SEARCH_FAILED);
             t_error.set_error_level(message::Error_level::MAJOR_ERROR);
             // 默认第一个车位
-            t_car_position.CopyFrom(t_current_parkspace_status.parkspace_info(0));
+            t_car_position.CopyFrom(m_parkspace_status_msg.parkspace_info(0));
             LOG(INFO) << "查询车位失败";
         }else{
             t_error.set_error_code(SUCCESS);
             t_error.set_error_level(message::Error_level::NORMAL);
-            message::Parkspace_info t_space_searching = t_current_parkspace_status.parkspace_info(index);
+            message::Parkspace_info t_space_searching = m_parkspace_status_msg.parkspace_info(index);
             t_car_position.CopyFrom(t_space_searching);
             LOG(INFO) << "车辆"<<car_info.license() <<"在第"<<index<<"号位, id: "<<t_space_searching.parkspace_id();
             // 无数据库操作
@@ -367,9 +426,9 @@ void Parkspace_allocator::execute_for_release(message::Parkspace_info space_info
     message::Error_manager t_error;
     message::Parkspace_info t_release_space;
     //获取当前所有车位状态,找到待释放的车位
-    message::Parkspace_allocation_status_msg t_current_parkspace_status = Parkspace_allocation_communicator::get_instance_references().get_status();
+//    message::Parkspace_allocation_status_msg t_current_parkspace_status =  get_status();
     int index = -1;
-    if(t_current_parkspace_status.parkspace_info_size()<=0)
+    if(m_parkspace_status_msg.parkspace_info_size()<=0)
     {
         t_error.set_error_code(PARKSPACE_ALLOCATOR_SPACE_EMPTY);
         t_error.set_error_level(message::Error_level::MAJOR_ERROR);
@@ -383,14 +442,14 @@ void Parkspace_allocator::execute_for_release(message::Parkspace_info space_info
     }
     else
     {
-        for (size_t i = 0; i < t_current_parkspace_status.parkspace_info_size(); i++)
+        for (size_t i = 0; i < m_parkspace_status_msg.parkspace_info_size(); i++)
         {
             // 找到占用或锁定的车位,且车辆信息匹配
-            if (t_current_parkspace_status.parkspace_info(i).parkspace_id() == space_info.parkspace_id()
-            && (t_current_parkspace_status.parkspace_info(i).parkspace_status() == message::Parkspace_status::eParkspace_occupied
-                ||t_current_parkspace_status.parkspace_info(i).parkspace_status() == message::Parkspace_status::eParkspace_locked)
-            && t_current_parkspace_status.parkspace_info(i).has_car_info()
-            && t_current_parkspace_status.parkspace_info(i).car_info().license() == space_info.car_info().license())
+            if (m_parkspace_status_msg.parkspace_info(i).parkspace_id() == space_info.parkspace_id()
+            && (m_parkspace_status_msg.parkspace_info(i).parkspace_status() == message::Parkspace_status::eParkspace_occupied
+                ||m_parkspace_status_msg.parkspace_info(i).parkspace_status() == message::Parkspace_status::eParkspace_locked)
+            && m_parkspace_status_msg.parkspace_info(i).has_car_info()
+            && m_parkspace_status_msg.parkspace_info(i).car_info().license() == space_info.car_info().license())
             {
                 index = i;
                 break;
@@ -405,11 +464,11 @@ void Parkspace_allocator::execute_for_release(message::Parkspace_info space_info
         }else{
             t_error.set_error_code(SUCCESS);
             t_error.set_error_level(message::Error_level::NORMAL);
-            message::Parkspace_info t_space_to_release = t_current_parkspace_status.parkspace_info(index);
+            message::Parkspace_info t_space_to_release = m_parkspace_status_msg.parkspace_info(index);
             t_space_to_release.set_parkspace_status(message::Parkspace_status::eParkspace_empty);
             t_release_space.CopyFrom(t_space_to_release);
             // 分配车位后更新车位状态
-            Parkspace_allocation_communicator::get_instance_references().update_parkspace_status(index, t_space_to_release);
+			 update_parkspace_status(index, t_space_to_release);
             LOG(INFO) << "第"<<index<<"号位释放, id: "<<t_space_to_release.parkspace_id();
             // 数据库操作,车位状态改为空闲,查询车辆状态,确定是停车失败还是取车完成
             // 停车失败仅修改车位与车辆状态
@@ -477,9 +536,9 @@ void Parkspace_allocator::execute_for_force_update(message::Parkspace_info space
     message::Error_manager t_error;
     message::Parkspace_info t_update_space;
     //获取当前所有车位状态,找到待释放的车位
-    message::Parkspace_allocation_status_msg t_current_parkspace_status = Parkspace_allocation_communicator::get_instance_references().get_status();
+//    message::Parkspace_allocation_status_msg t_current_parkspace_status =  get_status();
     int index = -1;
-    if(t_current_parkspace_status.parkspace_info_size()<=0)
+    if(m_parkspace_status_msg.parkspace_info_size()<=0)
     {
         t_error.set_error_code(PARKSPACE_ALLOCATOR_SPACE_EMPTY);
         t_error.set_error_level(message::Error_level::MAJOR_ERROR);
@@ -487,10 +546,10 @@ void Parkspace_allocator::execute_for_force_update(message::Parkspace_info space
     }
     else
     {
-        for (size_t i = 0; i < t_current_parkspace_status.parkspace_info_size(); i++)
+        for (size_t i = 0; i < m_parkspace_status_msg.parkspace_info_size(); i++)
         {
             // 找到高于车高且空闲车位,则分配
-            if (t_current_parkspace_status.parkspace_info(i).parkspace_id() == space_info.parkspace_id())
+            if (m_parkspace_status_msg.parkspace_info(i).parkspace_id() == space_info.parkspace_id())
             {
                 index = i;
                 break;
@@ -506,7 +565,7 @@ void Parkspace_allocator::execute_for_force_update(message::Parkspace_info space
             t_error.set_error_level(message::Error_level::NORMAL);
             t_update_space.CopyFrom(space_info);
             // 分配车位后更新车位状态
-            Parkspace_allocation_communicator::get_instance_references().update_parkspace_status(index, t_update_space);
+			 update_parkspace_status(index, t_update_space);
             LOG(INFO) << "第"<<index<<"号位已手动更新, id: "<<t_update_space.parkspace_id();
             // 数据库操作,车位状态根据手动值进行修改
             Error_manager ec = Parkspace_db_manager::get_instance_references().update_parkspace_status(t_update_space);
@@ -540,7 +599,7 @@ void Parkspace_allocator::execute_for_confirm_alloc(message::Parkspace_info spac
     message::Error_manager t_error;
     message::Parkspace_info t_confirm_space;
     //获取当前所有车位状态,找到待释放的车位
-    message::Parkspace_allocation_status_msg t_current_parkspace_status = Parkspace_allocation_communicator::get_instance_references().get_status();
+    message::Parkspace_allocation_status_msg t_current_parkspace_status =  get_status();
     int index = -1;
     if(t_current_parkspace_status.parkspace_info_size()<=0)
     {
@@ -558,12 +617,14 @@ void Parkspace_allocator::execute_for_confirm_alloc(message::Parkspace_info spac
     {
         for (size_t i = 0; i < t_current_parkspace_status.parkspace_info_size(); i++)
         {
-            // 找到相同车位,车辆信息匹配,且车位为锁定状态
+			// 找到相同车位,车辆信息匹配,且车位为锁定状态
             if (t_current_parkspace_status.parkspace_info(i).parkspace_id() == space_info.parkspace_id()
                 && t_current_parkspace_status.parkspace_info(i).parkspace_status() == message::Parkspace_status::eParkspace_locked
                 && t_current_parkspace_status.parkspace_info(i).has_car_info()
                 && t_current_parkspace_status.parkspace_info(i).car_info().license() == space_info.car_info().license())
             {
+
+
                 index = i;
                 break;
             }
@@ -573,7 +634,7 @@ void Parkspace_allocator::execute_for_confirm_alloc(message::Parkspace_info spac
             t_error.set_error_level(message::Error_level::MAJOR_ERROR);
             t_confirm_space.CopyFrom(space_info);
             LOG(WARNING) << "确认占用车位失败";
-        }else{
+		}else{
             t_error.set_error_code(SUCCESS);
             t_error.set_error_level(message::Error_level::NORMAL);
             t_confirm_space.CopyFrom(space_info);
@@ -591,7 +652,7 @@ void Parkspace_allocator::execute_for_confirm_alloc(message::Parkspace_info spac
                    t->tm_sec);
             t_confirm_space.set_entry_time(my_time_buf);
             // 分配车位后更新车位状态
-            Parkspace_allocation_communicator::get_instance_references().update_parkspace_status(index, t_confirm_space);
+			 update_parkspace_status(index, t_confirm_space);
             LOG(INFO) << "第" << index << "号位已确认占用, id: " << t_confirm_space.parkspace_id();
             // 数据库操作,车位状态改为占用,插入停车记录,更新车辆状态为入库
             Error_manager ec = Parkspace_db_manager::get_instance_references().update_parkspace_status(t_confirm_space);
@@ -619,4 +680,4 @@ void Parkspace_allocator::execute_for_confirm_alloc(message::Parkspace_info spac
     Communication_message response=Communication_message();
     response.reset(t_response_header, response_msg.SerializeAsString());
     Parkspace_allocation_communicator::get_instance_references().send_response(&response);
-}
+}

+ 16 - 5
parkspace_allocation/parkspace_allocator.h

@@ -56,6 +56,15 @@ public://API functions
     // 检查车辆是否已存在,通常分配前调用
     bool check_car_existence(std::string license, message::Parkspace_allocation_status_msg status_msg);
 
+	//获取所有车位状态
+	message::Parkspace_allocation_status_msg get_status();
+	//更新所有车位状态,现有状态将被全部覆盖,车位数量可能变动
+	Error_manager update_parkspace_status(message::Parkspace_allocation_status_msg message);
+	//更新某个车位状态,不修改车位数量,车位按编号从0开始
+	Error_manager update_parkspace_status(int parkspace_id, message::Parkspace_info parkspace_info);
+	//获取车位状态消息
+	message::Parkspace_allocation_status_msg& get_parkspace_status_msg();
+	std::mutex& get_status_mutex();
 private://execute_msg创建各线程进行处理
 	//分配车位线程函数
     void execute_for_allocate(message::Car_info car_info, int terminal_id, message::Command_info command_info);
@@ -74,11 +83,13 @@ private://execute_msg创建各线程进行处理
     int allocate_parkspace(message::Parkspace_allocation_status_msg parkspace_status, message::Car_info car_info, int terminal_id);
 
 private:
-    parkspace_proto::garage_config m_config;                    //车位配置文件
-    parkspace_allocator_status m_current_status;                //分配器当前状态
-    Thread_pool 				m_thread_pool;					//执行多任务的线程池
-    std::mutex                  m_mutex;                        //车位变动锁
-    Parkspace_db_manager*       mp_db_manager;                  //车位模块数据库管理句柄
+    parkspace_proto::garage_config 		m_config;                   	 //车位配置文件
+    parkspace_allocator_status 			m_current_status;                //分配器当前状态
+    Thread_pool 						m_thread_pool;					 //执行多任务的线程池
+    std::mutex                 			m_mutex;                         //车位变动锁
+    Parkspace_db_manager*     			mp_db_manager;                   //车位模块数据库管理句柄
+	message::Parkspace_allocation_status_msg      m_parkspace_status_msg;
+	std::mutex                   		 m_status_mutex;
 
 };
 

+ 402 - 426
parkspace_allocation/parkspace_db_manager.cpp

@@ -8,45 +8,40 @@
 
 #include "parkspace_db_manager.h"
 
+
+
+Parkspace_db_manager::Parkspace_db_manager()
+{
+	mb_initialized=false;
+}
+Parkspace_db_manager::~Parkspace_db_manager()
+{
+	Parkspace_db_manager_uninit();
+}
+
 // 车位数据库管理初始化
 Error_manager Parkspace_db_manager::Parkspace_db_manager_init(parkspace_proto::database_config config)
 {
     Error_manager ec = SUCCESS;
-    mp_db_controller = boost::shared_ptr<Database_controller>(Database_controller::get_instance_pointer());
-    if(mp_db_controller != nullptr)
-    {
-        ec = mp_db_controller->database_controller_init(config.db_ip(), config.db_port(), config.db_username(), config.db_passwd(), config.db_name(), config.db_conn_pool_size());
-        mb_initialized = true;
-        return ec;
-    }
-    else
-    {
-        mb_initialized = false;
-        return POINTER_IS_NULL;
-    }
+
+
+	ec =   m_db_controller.database_controller_init(config.db_ip(), config.db_port(), config.db_username(), config.db_passwd(), config.db_name(), config.db_conn_pool_size());
+	mb_initialized = true;
+	return ec;
 }
 // 车位数据库管理反初始化
 Error_manager Parkspace_db_manager::Parkspace_db_manager_uninit()
 {
-    if(mp_db_controller!=nullptr)
-    {
-        return mp_db_controller->database_controller_uninit();
-    }else{
-        return POINTER_IS_NULL;
-    }
+	mb_initialized=false;
+	return POINTER_IS_NULL;
 }
 
 // 连接状态
 bool Parkspace_db_manager::is_connected()
 {
-    if(mp_db_controller!=nullptr)
-    {
-        mb_connected = mp_db_controller->is_connected();
-        return mb_connected;
-    }
-    else{
-        return false;
-    }
+
+	mb_connected =   m_db_controller.is_connected();
+	return mb_connected;
 }
 
 // 初始化状态
@@ -63,89 +58,86 @@ Error_manager Parkspace_db_manager::get_all_parkspace_info(message::Parkspace_al
     {
         return DB_UNINITIALIZED;
     }
-    if(mp_db_controller == nullptr)
-    {
-        return POINTER_IS_NULL;
-    }else{
-        //执行sql操作
-        std::string get_all_space_sql = "select * from parkingspace";
-        boost::shared_ptr<sql::ResultSet>  tp_result = nullptr;
-        Error_manager ec = mp_db_controller->sql_query(get_all_space_sql, tp_result);
-        if(ec == SUCCESS)
-        {
-            if(tp_result == nullptr)
-            {
-                return DB_RESULT_SET_EMPTY;
-            }
-            all_parkspace_info.clear_parkspace_info();
-            while (tp_result->next())
-            {
-                message::Parkspace_info *t_parkspace = all_parkspace_info.add_parkspace_info();
-                char buf[1024];
-                memset(buf, 0, 1024);
-                try
-                {
-                    t_parkspace->set_parkspace_id(tp_result->getInt("parkingSpaceID"));
-                    t_parkspace->set_index(tp_result->getInt("parkingSpaceX"));
-                    if (tp_result->getInt("parkingSpaceY") > 0)
-                    {
-                        t_parkspace->set_direction(message::Direction::eForward);
-                    }
-                    else
-                    {
-                        t_parkspace->set_direction(message::Direction::eBackward);
-                    }
-                    t_parkspace->set_floor(tp_result->getInt("parkingSpaceZ"));
-                    switch (tp_result->getInt("parkingSpaceState"))
-                    {
-                    case 0:
-                        t_parkspace->set_parkspace_status(message::Parkspace_status::eParkspace_empty);
-                        break;
-                    case 1:
-                        t_parkspace->set_parkspace_status(message::Parkspace_status::eParkspace_occupied);
-                        break;
-                    case 2:
-                        t_parkspace->set_parkspace_status(message::Parkspace_status::eParkspace_reserved);
-                        break;
-                    case 3:
-                        t_parkspace->set_parkspace_status(message::Parkspace_status::eParkspace_locked);
-                        break;
-                    case 4:
-                        t_parkspace->set_parkspace_status(message::Parkspace_status::eParkspace_error);
-                        break;
-                    default:
-                        t_parkspace->set_parkspace_status(message::Parkspace_status::eParkspace_error);
-                        break;
-                    }
-                    t_parkspace->set_block_id(tp_result->getInt("parkingSpaceBlockID"));
-                    t_parkspace->set_width(tp_result->getDouble("parkSpaceWidth"));
-                    t_parkspace->set_height(tp_result->getDouble("parkSpaceHeight"));
-                    t_parkspace->mutable_car_info()->set_license(tp_result->getString("parkSpaceCarLicense"));
-                    t_parkspace->mutable_car_info()->set_car_length(tp_result->getDouble("parkSpaceCarLength"));
-                    t_parkspace->mutable_car_info()->set_car_width(tp_result->getDouble("parkSpaceCarWidth"));
-                    t_parkspace->mutable_car_info()->set_car_height(tp_result->getDouble("parkSpaceCarHeight"));
-                    t_parkspace->set_entry_time(tp_result->getString("entryTime"));
-                    t_parkspace->set_leave_time(tp_result->getString("leaveTime"));
-                }
-                catch (sql::SQLException &e)
-                {
-                    /* Use what() (derived from std::runtime_error) to fetch the error message */
-                    sprintf(buf, "# ERR: %s\n (MySQL error code: %d, SQLState: %s", e.what(), e.getErrorCode(), e.getSQLState().c_str());
-                    return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
-                }
-                catch (std::runtime_error &e)
-                {
-                    sprintf(buf, "# ERR: %s\n ERR: runtime_error in  %s ", e.what(), __FILE__);
-                    return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
-                }
-            }
-            return SUCCESS;
-        }
-        else
-        {
-            return ec;
-        }
-    }
+    
+	//执行sql操作
+	std::string get_all_space_sql = "select * from parkingspace";
+	boost::shared_ptr<sql::ResultSet>  tp_result = nullptr;
+	Error_manager ec =   m_db_controller.sql_query(get_all_space_sql, tp_result);
+	if(ec == SUCCESS)
+	{
+		if(tp_result == nullptr)
+		{
+			return DB_RESULT_SET_EMPTY;
+		}
+		all_parkspace_info.clear_parkspace_info();
+		while (tp_result->next())
+		{
+			message::Parkspace_info *t_parkspace = all_parkspace_info.add_parkspace_info();
+			char buf[1024];
+			memset(buf, 0, 1024);
+			try
+			{
+				t_parkspace->set_parkspace_id(tp_result->getInt("parkingSpaceID"));
+				t_parkspace->set_index(tp_result->getInt("parkingSpaceX"));
+				if (tp_result->getInt("parkingSpaceY") > 0)
+				{
+					t_parkspace->set_direction(message::Direction::eForward);
+				}
+				else
+				{
+					t_parkspace->set_direction(message::Direction::eBackward);
+				}
+				t_parkspace->set_floor(tp_result->getInt("parkingSpaceZ"));
+				switch (tp_result->getInt("parkingSpaceState"))
+				{
+				case 0:
+					t_parkspace->set_parkspace_status(message::Parkspace_status::eParkspace_empty);
+					break;
+				case 1:
+					t_parkspace->set_parkspace_status(message::Parkspace_status::eParkspace_occupied);
+					break;
+				case 2:
+					t_parkspace->set_parkspace_status(message::Parkspace_status::eParkspace_reserved);
+					break;
+				case 3:
+					t_parkspace->set_parkspace_status(message::Parkspace_status::eParkspace_locked);
+					break;
+				case 4:
+					t_parkspace->set_parkspace_status(message::Parkspace_status::eParkspace_error);
+					break;
+				default:
+					t_parkspace->set_parkspace_status(message::Parkspace_status::eParkspace_error);
+					break;
+				}
+				t_parkspace->set_block_id(tp_result->getInt("parkingSpaceBlockID"));
+				t_parkspace->set_width(tp_result->getDouble("parkSpaceWidth"));
+				t_parkspace->set_height(tp_result->getDouble("parkSpaceHeight"));
+				t_parkspace->mutable_car_info()->set_license(tp_result->getString("parkSpaceCarLicense"));
+				t_parkspace->mutable_car_info()->set_car_length(tp_result->getDouble("parkSpaceCarLength"));
+				t_parkspace->mutable_car_info()->set_car_width(tp_result->getDouble("parkSpaceCarWidth"));
+				t_parkspace->mutable_car_info()->set_car_height(tp_result->getDouble("parkSpaceCarHeight"));
+				t_parkspace->set_entry_time(tp_result->getString("entryTime"));
+				t_parkspace->set_leave_time(tp_result->getString("leaveTime"));
+			}
+			catch (sql::SQLException &e)
+			{
+				// Use what() (derived from std::runtime_error) to fetch the error message
+				sprintf(buf, "# ERR: %s\n (MySQL error code: %d, SQLState: %s", e.what(), e.getErrorCode(), e.getSQLState().c_str());
+				return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
+			}
+			catch (std::runtime_error &e)
+			{
+				sprintf(buf, "# ERR: %s\n ERR: runtime_error in  %s ", e.what(), __FILE__);
+				return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
+			}
+		}
+		return SUCCESS;
+	}
+	else
+	{
+		return ec;
+	}
+    
 }
 
 // 更新数据库中所有车位信息
@@ -162,54 +154,51 @@ Error_manager Parkspace_db_manager::update_parkspace_status(message::Parkspace_i
     {
         return DB_UNINITIALIZED;
     }
-    if(mp_db_controller == nullptr)
-    {
-        return POINTER_IS_NULL;
-    }else{
-        //执行sql操作
-        char update_space_sql[1024];
-        memset(update_space_sql, 0, 1024);
-        int status = -1;
-        switch (parkspace_info.parkspace_status())
-        {
-        case message::Parkspace_status::eParkspace_empty:
-            status = 0;
-            break;
-        case message::Parkspace_status::eParkspace_occupied:
-            status = 1;
-            break;
-        case message::Parkspace_status::eParkspace_reserved:
-            status = 2;
-            break;
-        case message::Parkspace_status::eParkspace_locked:
-            status = 3;
-            break;
-        case message::Parkspace_status::eParkspace_error:
-            status = 4;
-            break;
-        default:
-            break;
-        }
-        if(parkspace_info.has_car_info())
-        {
-            sprintf(update_space_sql, "update parkingspace set parkingSpaceState = %d,parkSpaceCarLicense = '%s',parkSpaceCarLength = %.3f,parkSpaceCarWidth = %.3f,parkSpaceCarHeight = %.3f,entryTime = '%s',leaveTime = '%s' where parkingSpaceID = %d",
-                    status, 
-                    parkspace_info.car_info().license().c_str(),
-                    parkspace_info.car_info().has_car_length()?parkspace_info.car_info().car_length():0.0f,
-                    parkspace_info.car_info().car_width(),
-                    parkspace_info.car_info().car_height(),
-                    parkspace_info.entry_time().c_str(),
-                    parkspace_info.leave_time().c_str(),
-                    parkspace_info.parkspace_id());
-        }else{
-            sprintf(update_space_sql, "update parkingspace set parkingSpaceState = %d where parkingSpaceID = %d", status, parkspace_info.parkspace_id());
-        }
-        if(status < 0)
-            return ERROR;
-        boost::shared_ptr<sql::ResultSet>  tp_result = nullptr;
-        Error_manager ec = mp_db_controller->sql_update(update_space_sql);
-        return ec;
-    }
+
+	//执行sql操作
+	char update_space_sql[1024];
+	memset(update_space_sql, 0, 1024);
+	int status = -1;
+	switch (parkspace_info.parkspace_status())
+	{
+	case message::Parkspace_status::eParkspace_empty:
+		status = 0;
+		break;
+	case message::Parkspace_status::eParkspace_occupied:
+		status = 1;
+		break;
+	case message::Parkspace_status::eParkspace_reserved:
+		status = 2;
+		break;
+	case message::Parkspace_status::eParkspace_locked:
+		status = 3;
+		break;
+	case message::Parkspace_status::eParkspace_error:
+		status = 4;
+		break;
+	default:
+		break;
+	}
+	if(parkspace_info.has_car_info())
+	{
+		sprintf(update_space_sql, "update parkingspace set parkingSpaceState = %d,parkSpaceCarLicense = '%s',parkSpaceCarLength = %.3f,parkSpaceCarWidth = %.3f,parkSpaceCarHeight = %.3f,entryTime = '%s',leaveTime = '%s' where parkingSpaceID = %d",
+				status, 
+				parkspace_info.car_info().license().c_str(),
+				parkspace_info.car_info().has_car_length()?parkspace_info.car_info().car_length():0.0f,
+				parkspace_info.car_info().car_width(),
+				parkspace_info.car_info().car_height(),
+				parkspace_info.entry_time().c_str(),
+				parkspace_info.leave_time().c_str(),
+				parkspace_info.parkspace_id());
+	}else{
+		sprintf(update_space_sql, "update parkingspace set parkingSpaceState = %d where parkingSpaceID = %d", status, parkspace_info.parkspace_id());
+	}
+	if(status < 0)
+		return ERROR;
+	boost::shared_ptr<sql::ResultSet>  tp_result = nullptr;
+	Error_manager ec =   m_db_controller.sql_update(update_space_sql);
+	return ec;
+
 }
 
 // 更新数据库车辆状态,车位信息中包含车辆信息用于匹配更新
@@ -220,141 +209,137 @@ Error_manager Parkspace_db_manager::update_vehicle_status(message::Parkspace_inf
     {
         return DB_UNINITIALIZED;
     }
-    if(mp_db_controller == nullptr)
-    {
-        return POINTER_IS_NULL;
-    }else{
-        //执行sql操作
-        if(!parkspace_info.has_car_info())
-        {
-            return PARAMETER_ERROR;
-        }
-        std::string find_vehicle_sql = std::string("select * from vehicle where numberPlate = '").append(parkspace_info.car_info().license()).append("'");
-        boost::shared_ptr<sql::ResultSet> query_vehicle_result = nullptr;
-        mp_db_controller->sql_query(find_vehicle_sql, query_vehicle_result);
-        //判断车辆是否存在
-        if(query_vehicle_result == nullptr || !query_vehicle_result->next())
-        {
-            return insert_vehicle(parkspace_info, vehicle_status);
-        }else{
-            char update_vehicle_sql[1024];
-            memset(update_vehicle_sql, 0, 1024);
-            int vehicle_status_code = -1;
-            switch (vehicle_status)
-            {
-            case message::Vehicle_status::eVehicle_idle:
-                vehicle_status_code = 0;
-                break;
-            case message::Vehicle_status::eVehicle_in_garage:
-                vehicle_status_code = 1;
-                break;
-            case message::Vehicle_status::eVehicle_parking:
-                vehicle_status_code = 2;
-                break;
-            case message::Vehicle_status::eVehicle_fetching:
-                vehicle_status_code = 3;
-                break;
-            case message::Vehicle_status::eVehicle_reserved:
-                vehicle_status_code = 4;
-                break;
-            default:
-                break;
-            }
-            //车位为空,仅更新车辆状态与长宽高
-            if(parkspace_info.parkspace_id() <= 0)
-            {
-                sprintf(update_vehicle_sql, "update vehicle set vehicleParkState = %d,carLength=%.3f,carWidth=%.3f,carHeight=%.3f where numberPlate = '%s'", 
-                        vehicle_status_code,
-                        parkspace_info.car_info().car_length(),
-                        parkspace_info.car_info().car_width(),
-                        parkspace_info.car_info().car_height(),
-                        parkspace_info.car_info().license().c_str());
-            }
-            //车位不为空,表示车辆所在车位,同时更新
-            else
-            {
-                 sprintf(update_vehicle_sql, "update vehicle set vehicleParkState = %d,carLength=%.3f,carWidth=%.3f,carHeight=%.3f,parkingSpaceID=%d where numberPlate = '%s'", 
-                        vehicle_status_code,
-                        parkspace_info.car_info().car_length(),
-                        parkspace_info.car_info().car_width(),
-                        parkspace_info.car_info().car_height(),
-                        parkspace_info.parkspace_id(),
-                        parkspace_info.car_info().license().c_str());
-            }
-            if (vehicle_status_code < 0)
-                return ERROR;
-            Error_manager ec = mp_db_controller->sql_update(update_vehicle_sql);
-            return ec;
-        }
-    }
+
+	//执行sql操作
+	if(!parkspace_info.has_car_info())
+	{
+		return PARAMETER_ERROR;
+	}
+	std::string find_vehicle_sql = std::string("select * from vehicle where numberPlate = '").append(parkspace_info.car_info().license()).append("'");
+	boost::shared_ptr<sql::ResultSet> query_vehicle_result = nullptr;
+	  m_db_controller.sql_query(find_vehicle_sql, query_vehicle_result);
+	//判断车辆是否存在
+	if(query_vehicle_result == nullptr || !query_vehicle_result->next())
+	{
+		return insert_vehicle(parkspace_info, vehicle_status);
+	}else{
+		char update_vehicle_sql[1024];
+		memset(update_vehicle_sql, 0, 1024);
+		int vehicle_status_code = -1;
+		switch (vehicle_status)
+		{
+		case message::Vehicle_status::eVehicle_idle:
+			vehicle_status_code = 0;
+			break;
+		case message::Vehicle_status::eVehicle_in_garage:
+			vehicle_status_code = 1;
+			break;
+		case message::Vehicle_status::eVehicle_parking:
+			vehicle_status_code = 2;
+			break;
+		case message::Vehicle_status::eVehicle_fetching:
+			vehicle_status_code = 3;
+			break;
+		case message::Vehicle_status::eVehicle_reserved:
+			vehicle_status_code = 4;
+			break;
+		default:
+			break;
+		}
+		//车位为空,仅更新车辆状态与长宽高
+		if(parkspace_info.parkspace_id() <= 0)
+		{
+			sprintf(update_vehicle_sql, "update vehicle set vehicleParkState = %d,carLength=%.3f,carWidth=%.3f,carHeight=%.3f where numberPlate = '%s'",
+					vehicle_status_code,
+					parkspace_info.car_info().car_length(),
+					parkspace_info.car_info().car_width(),
+					parkspace_info.car_info().car_height(),
+					parkspace_info.car_info().license().c_str());
+		}
+		//车位不为空,表示车辆所在车位,同时更新
+		else
+		{
+			 sprintf(update_vehicle_sql, "update vehicle set vehicleParkState = %d,carLength=%.3f,carWidth=%.3f,carHeight=%.3f,parkingSpaceID=%d where numberPlate = '%s'",
+					vehicle_status_code,
+					parkspace_info.car_info().car_length(),
+					parkspace_info.car_info().car_width(),
+					parkspace_info.car_info().car_height(),
+					parkspace_info.parkspace_id(),
+					parkspace_info.car_info().license().c_str());
+		}
+		if (vehicle_status_code < 0)
+			return ERROR;
+		Error_manager ec =   m_db_controller.sql_update(update_vehicle_sql);
+		return ec;
+	}
+
 }
 
 // 插入车辆
 Error_manager Parkspace_db_manager::insert_vehicle(message::Parkspace_info parkspace_info, message::Vehicle_status &vehicle_status)
-{
-    // 基本条件判断
+{		
+
+	// 基本条件判断
     if(!mb_initialized)
     {
         return DB_UNINITIALIZED;
     }
-    if(mp_db_controller == nullptr)
-    {
-        return POINTER_IS_NULL;
-    }else{
-        //执行sql操作
-        if(!parkspace_info.has_car_info())
-        {
-            return PARAMETER_ERROR;
-        }
-        char insert_vehicle_sql[1024];
-        memset(insert_vehicle_sql, 0, 1024);
-        int vehicle_status_code = -1;
-        switch (vehicle_status)
-        {
-        case message::Vehicle_status::eVehicle_idle:
-            vehicle_status_code = 0;
-            break;
-        case message::Vehicle_status::eVehicle_in_garage:
-            vehicle_status_code = 1;
-            break;
-        case message::Vehicle_status::eVehicle_parking:
-            vehicle_status_code = 2;
-            break;
-        case message::Vehicle_status::eVehicle_fetching:
-            vehicle_status_code = 3;
-            break;
-        case message::Vehicle_status::eVehicle_reserved:
-            vehicle_status_code = 4;
-            break;
-        default:
-            break;
-        }
-        //车位为空,仅更新车辆状态与长宽高
-        if(parkspace_info.parkspace_id() <= 0)
-        {
-            sprintf(insert_vehicle_sql, "INSERT INTO vehicle (numberPlate,vehicleParkState,carLength,carWidth,carHeight) values ('%s',%d,%.3f,%.3f,%.3f)", 
-                    parkspace_info.car_info().license().c_str(),
-                    vehicle_status_code,
-                    parkspace_info.car_info().car_length(),
-                    parkspace_info.car_info().car_width(),
-                    parkspace_info.car_info().car_height());
-        }
-        //车位不为空,表示车辆在车位,同时更新
-        else
-        {
-            sprintf(insert_vehicle_sql, "INSERT INTO vehicle (numberPlate,vehicleParkState,carLength,carWidth,carHeight,parkingSpaceID) values ('%s',%d,%.3f,%.3f,%.3f,%d)", 
-                parkspace_info.car_info().license().c_str(),
-                vehicle_status_code,
-                parkspace_info.car_info().car_length(),
-                parkspace_info.car_info().car_width(),
-                parkspace_info.car_info().car_height(),
-                parkspace_info.parkspace_id());
-        }
-        if (vehicle_status_code < 0)
-            return ERROR;
-        Error_manager ec = mp_db_controller->sql_insert(insert_vehicle_sql);
-        return ec;
-    }
+	//执行sql操作
+	if(!parkspace_info.has_car_info())
+	{
+		return PARAMETER_ERROR;
+	}
+	char insert_vehicle_sql[1024];
+	memset(insert_vehicle_sql, 0, 1024);
+	int vehicle_status_code = -1;
+	switch (vehicle_status)
+	{
+	case message::Vehicle_status::eVehicle_idle:
+		vehicle_status_code = 0;
+		break;
+	case message::Vehicle_status::eVehicle_in_garage:
+		vehicle_status_code = 1;
+		break;
+	case message::Vehicle_status::eVehicle_parking:
+		vehicle_status_code = 2;
+		break;
+	case message::Vehicle_status::eVehicle_fetching:
+		vehicle_status_code = 3;
+		break;
+	case message::Vehicle_status::eVehicle_reserved:
+		vehicle_status_code = 4;
+		break;
+	default:
+		break;
+	}
+	//车位为空,仅更新车辆状态与长宽高
+	if(parkspace_info.parkspace_id() <= 0)
+	{
+		sprintf(insert_vehicle_sql, "INSERT INTO vehicle (numberPlate,vehicleParkState,carLength,carWidth,carHeight) values ('%s',%d,%.3f,%.3f,%.3f)", 
+				parkspace_info.car_info().license().c_str(),
+				vehicle_status_code,
+				parkspace_info.car_info().car_length(),
+				parkspace_info.car_info().car_width(),
+				parkspace_info.car_info().car_height());
+	}
+	//车位不为空,表示车辆在车位,同时更新
+	else
+	{
+		
+		sprintf(insert_vehicle_sql, "INSERT INTO vehicle (numberPlate,vehicleParkState,carLength,carWidth,carHeight,parkingSpaceID) values ('%s',%d,%.3f,%.3f,%.3f,%d)",
+			parkspace_info.car_info().license().c_str(),
+			vehicle_status_code,
+			parkspace_info.car_info().car_length(),
+			parkspace_info.car_info().car_width(),
+			parkspace_info.car_info().car_height(),
+			parkspace_info.parkspace_id());
+	}
+	if (vehicle_status_code < 0)
+		return ERROR;
+	Error_manager ec =   m_db_controller.sql_insert(insert_vehicle_sql);
+
+	return ec;
+    
 }
 
 // 插入停车记录
@@ -365,25 +350,22 @@ Error_manager Parkspace_db_manager::insert_parking_record(message::Parkspace_inf
     {
         return DB_UNINITIALIZED;
     }
-    if(mp_db_controller == nullptr)
-    {
-        return POINTER_IS_NULL;
-    }else{
-        //参数中必须包含车辆信息与车位编号
-        if(!parkspace_info.has_car_info() || parkspace_info.parkspace_id() <= 0)
-        {
-            return PARAMETER_ERROR;
-        }
-        char insert_parking_record_sql[1024];
-        memset(insert_parking_record_sql, 0, 1024);
-        //将车辆号牌,车位ID,记录状态,停车与取车时间写入
-            sprintf(insert_parking_record_sql, "INSERT INTO parkingrecords (numberPlate,parkingSpaceID,realParkTime) values ('%s',%d,'%s')", 
-                    parkspace_info.car_info().license().c_str(),
-                    parkspace_info.parkspace_id(),
-                    parkspace_info.entry_time().c_str());
-        Error_manager ec = mp_db_controller->sql_insert(insert_parking_record_sql);
-        return ec;
-    }
+
+	//参数中必须包含车辆信息与车位编号
+	if(!parkspace_info.has_car_info() || parkspace_info.parkspace_id() <= 0)
+	{
+		return PARAMETER_ERROR;
+	}
+	char insert_parking_record_sql[1024];
+	memset(insert_parking_record_sql, 0, 1024);
+	//将车辆号牌,车位ID,记录状态,停车与取车时间写入
+		sprintf(insert_parking_record_sql, "INSERT INTO parkingrecords (numberPlate,parkingSpaceID,realParkTime) values ('%s',%d,'%s')", 
+				parkspace_info.car_info().license().c_str(),
+				parkspace_info.parkspace_id(),
+				parkspace_info.entry_time().c_str());
+	Error_manager ec =   m_db_controller.sql_insert(insert_parking_record_sql);
+	return ec;
+    
 }
 
 // 更新停车记录,待计费系统加入后完善!!!
@@ -394,10 +376,7 @@ Error_manager Parkspace_db_manager::update_parking_record(message::Parkspace_inf
     {
         return DB_UNINITIALIZED;
     }
-    if(mp_db_controller == nullptr)
-    {
-        return POINTER_IS_NULL;
-    }else{
+
         //执行sql操作
         if(!parkspace_info.has_car_info() || parkspace_info.parkspace_id() <= 0)
         {
@@ -409,9 +388,9 @@ Error_manager Parkspace_db_manager::update_parking_record(message::Parkspace_inf
                 parkspace_info.leave_time().c_str(),
                 0,
                 record_id);
-        Error_manager ec = mp_db_controller->sql_update(update_parking_record_sql);
+        Error_manager ec =   m_db_controller.sql_update(update_parking_record_sql);
         return ec;
-    }
+    
 }
 
 // 根据车位编号查询车位状态
@@ -422,14 +401,11 @@ Error_manager Parkspace_db_manager::query_parkspace(int parkspace_id, message::P
     {
         return DB_UNINITIALIZED;
     }
-    if(mp_db_controller == nullptr)
-    {
-        return POINTER_IS_NULL;
-    }else{
+
         //执行sql操作
-        std::string query_parkspace_sql = std::string("select * from parkingspace where parkspace_id=").append(std::to_string(parkspace_id));
+        std::string query_parkspace_sql = std::string("select * from parkingspace where parkingSpaceID=").append(std::to_string(parkspace_id));
         boost::shared_ptr<sql::ResultSet>  tp_result = nullptr;
-        Error_manager ec = mp_db_controller->sql_query(query_parkspace_sql, tp_result);
+        Error_manager ec =   m_db_controller.sql_query(query_parkspace_sql, tp_result);
         if(ec == SUCCESS)
         {
             if(tp_result == nullptr)
@@ -466,10 +442,15 @@ Error_manager Parkspace_db_manager::query_parkspace(int parkspace_id, message::P
                     parkspace_info.set_index(tp_result->getInt("parkingSpaceX"));
                     parkspace_info.set_direction(tp_result->getInt("parkingSpaceY") > 0 ? message::Direction::eForward : message::Direction::eBackward);
                     parkspace_info.set_floor(tp_result->getInt("parkingSpaceZ"));
-                    parkspace_info.mutable_car_info()->set_license(tp_result->getString("parkSpaceCarLicense"));
-                    parkspace_info.mutable_car_info()->set_car_length(tp_result->getDouble("parkSpaceCatLength"));
-                    parkspace_info.mutable_car_info()->set_car_width(tp_result->getDouble("parkSpaceCarWidth"));
+//					parkspace_info.set_length();//数据库暂时没有此字段 后续添加再用
+					parkspace_info.set_width(tp_result->getDouble("parkSpaceWidth"));
+					parkspace_info.set_height(tp_result->getDouble("parkSpaceheight"));
+
+					parkspace_info.mutable_car_info()->set_license(tp_result->getString("parkSpaceCarLicense"));
+					parkspace_info.mutable_car_info()->set_car_length(tp_result->getDouble("parkSpaceCarLength"));
+					parkspace_info.mutable_car_info()->set_car_width(tp_result->getDouble("parkSpaceCarWidth"));
                     parkspace_info.mutable_car_info()->set_car_height(tp_result->getDouble("parkSpaceCarHeight"));
+
                     parkspace_info.set_entry_time(tp_result->getString("entryTime"));
                     parkspace_info.set_leave_time(tp_result->getString("leaveTime"));
                 }
@@ -491,7 +472,7 @@ Error_manager Parkspace_db_manager::query_parkspace(int parkspace_id, message::P
         {
             return ec;
         }
-    }
+    
 }
 
 // 查询车辆状态,暂时不使用
@@ -502,68 +483,65 @@ Error_manager Parkspace_db_manager::query_vehicle(std::string license, message::
     {
         return DB_UNINITIALIZED;
     }
-    if(mp_db_controller == nullptr)
-    {
-        return POINTER_IS_NULL;
-    }else{
-        //执行sql操作
-        std::string query_parkspace_sql = std::string("select * from vehicle where numberPlate='").append(license).append("'");
-        boost::shared_ptr<sql::ResultSet>  tp_result = nullptr;
-        Error_manager ec = mp_db_controller->sql_query(query_parkspace_sql, tp_result);
-        if(ec == SUCCESS)
-        {
-            if(tp_result == nullptr)
-            {
-                return DB_RESULT_SET_EMPTY;
-            }
-            if (tp_result->next())
-            {
-                char buf[1024];
-                memset(buf, 0, 1024);
-                try
-                {
-                    switch (tp_result->getInt("vehicleParkState"))
-                    {
-                    case 0:
-                        vehicle_status = message::Vehicle_status::eVehicle_idle;
-                        break;
-                    case 1:
-                        vehicle_status = message::Vehicle_status::eVehicle_in_garage;
-                        break;
-                    case 2:
-                        vehicle_status = message::Vehicle_status::eVehicle_parking;
-                        break;
-                    case 3:
-                        vehicle_status = message::Vehicle_status::eVehicle_fetching;
-                        break;
-                    case 4:
-                        vehicle_status = message::Vehicle_status::eVehicle_reserved;
-                        break;
-                    default:
-                        vehicle_status = message::Vehicle_status::eVehicle_reserved;
-                        break;
-                    }
-                    park_record_id = tp_result->getInt("parkingRecordsID");
-                }
-                catch (sql::SQLException &e)
-                {
-                    /* Use what() (derived from std::runtime_error) to fetch the error message */
-                    sprintf(buf, "# ERR: %s\n (MySQL error code: %d, SQLState: %s", e.what(), e.getErrorCode(), e.getSQLState().c_str());
-                    return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
-                }
-                catch (std::runtime_error &e)
-                {
-                    sprintf(buf, "# ERR: %s\n ERR: runtime_error in  %s ", e.what(), __FILE__);
-                    return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
-                }
-            }
-            return SUCCESS;
-        }
-        else
-        {
-            return ec;
-        }
-    }
+
+	//执行sql操作
+	std::string query_parkspace_sql = std::string("select * from vehicle where numberPlate='").append(license).append("'");
+	boost::shared_ptr<sql::ResultSet>  tp_result = nullptr;
+	Error_manager ec =   m_db_controller.sql_query(query_parkspace_sql, tp_result);
+	if(ec == SUCCESS)
+	{
+		if(tp_result == nullptr)
+		{
+			return DB_RESULT_SET_EMPTY;
+		}
+		if (tp_result->next())
+		{
+			char buf[1024];
+			memset(buf, 0, 1024);
+			try
+			{
+				switch (tp_result->getInt("vehicleParkState"))
+				{
+				case 0:
+					vehicle_status = message::Vehicle_status::eVehicle_idle;
+					break;
+				case 1:
+					vehicle_status = message::Vehicle_status::eVehicle_in_garage;
+					break;
+				case 2:
+					vehicle_status = message::Vehicle_status::eVehicle_parking;
+					break;
+				case 3:
+					vehicle_status = message::Vehicle_status::eVehicle_fetching;
+					break;
+				case 4:
+					vehicle_status = message::Vehicle_status::eVehicle_reserved;
+					break;
+				default:
+					vehicle_status = message::Vehicle_status::eVehicle_reserved;
+					break;
+				}
+				park_record_id = tp_result->getInt("parkingRecordsID");
+			}
+			catch (sql::SQLException &e)
+			{
+				/* Use what() (derived from std::runtime_error) to fetch the error message */
+				sprintf(buf, "# ERR: %s\n (MySQL error code: %d, SQLState: %s", e.what(), e.getErrorCode(), e.getSQLState().c_str());
+				return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
+			}
+			catch (std::runtime_error &e)
+			{
+				sprintf(buf, "# ERR: %s\n ERR: runtime_error in  %s ", e.what(), __FILE__);
+				return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
+			}
+		}
+		return SUCCESS;
+	}
+	else
+	{
+		return ec;
+	}
+
 }
 
 // 查询停车记录,根据车牌号、车位id查询,反馈停车记录id
@@ -574,49 +552,47 @@ Error_manager Parkspace_db_manager::query_parking_record(message::Parkspace_info
     {
         return DB_UNINITIALIZED;
     }
-    if(mp_db_controller == nullptr)
-    {
-        return POINTER_IS_NULL;
-    }else{
-        //执行sql操作
-        if(!parkspace_info.has_car_info() || parkspace_info.parkspace_id() <= 0)
-        {
-            return PARAMETER_ERROR;
-        }
-        std::string query_park_record_sql = std::string("select * from parkingrecords where numberPlate='").append(parkspace_info.car_info().license()).append("' and parkingSpaceID=").append(std::to_string(parkspace_info.parkspace_id())).append(" ORDER BY parkingRecordsID DESC");
-        boost::shared_ptr<sql::ResultSet>  tp_result = nullptr;
-        Error_manager ec = mp_db_controller->sql_query(query_park_record_sql, tp_result);
-        if(ec == SUCCESS)
-        {
-            if(tp_result == nullptr)
-            {
-                return DB_RESULT_SET_EMPTY;
-            }
-            if (tp_result->next())
-            {
-                char buf[1024];
-                memset(buf, 0, 1024);
-                try
-                {
-                    record_id = tp_result->getInt("parkingRecordsID");
-                }
-                catch (sql::SQLException &e)
-                {
-                    /* Use what() (derived from std::runtime_error) to fetch the error message */
-                    sprintf(buf, "# ERR: %s\n (MySQL error code: %d, SQLState: %s", e.what(), e.getErrorCode(), e.getSQLState().c_str());
-                    return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
-                }
-                catch (std::runtime_error &e)
-                {
-                    sprintf(buf, "# ERR: %s\n ERR: runtime_error in  %s ", e.what(), __FILE__);
-                    return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
-                }
-            }
-            return SUCCESS;
-        }
-        else
-        {
-            return ec;
-        }
-    }
+
+	//执行sql操作
+	if(!parkspace_info.has_car_info() || parkspace_info.parkspace_id() <= 0)
+	{
+		return PARAMETER_ERROR;
+	}
+	std::string query_park_record_sql = std::string("select * from parkingrecords where numberPlate='").append(parkspace_info.car_info().license()).append("' and parkingSpaceID=").append(std::to_string(parkspace_info.parkspace_id())).append(" ORDER BY parkingRecordsID DESC");
+	boost::shared_ptr<sql::ResultSet>  tp_result = nullptr;
+	Error_manager ec =   m_db_controller.sql_query(query_park_record_sql, tp_result);
+	if(ec == SUCCESS)
+	{
+		if(tp_result == nullptr)
+		{
+			return DB_RESULT_SET_EMPTY;
+		}
+		if (tp_result->next())
+		{
+			char buf[1024];
+			memset(buf, 0, 1024);
+			try
+			{
+				record_id = tp_result->getInt("parkingRecordsID");
+			}
+			catch (sql::SQLException &e)
+			{
+				/* Use what() (derived from std::runtime_error) to fetch the error message */
+				sprintf(buf, "# ERR: %s\n (MySQL error code: %d, SQLState: %s", e.what(), e.getErrorCode(), e.getSQLState().c_str());
+				return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
+			}
+			catch (std::runtime_error &e)
+			{
+				sprintf(buf, "# ERR: %s\n ERR: runtime_error in  %s ", e.what(), __FILE__);
+				return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
+			}
+		}
+		return SUCCESS;
+	}
+	else
+	{
+		return ec;
+	}
+    
 }
+

+ 55 - 48
parkspace_allocation/parkspace_db_manager.h

@@ -18,55 +18,62 @@
 #include "database_controller.h"
 #include <atomic>
 
-class Parkspace_db_manager : public Singleton<Parkspace_db_manager>
-{
-    // 子类必须把父类设定为友元函数,这样父类才能使用子类的私有构造函数。
-    friend class Singleton<Parkspace_db_manager>;
+	class Parkspace_db_manager : public Singleton<Parkspace_db_manager>
+	{
+		// 子类必须把父类设定为友元函数,这样父类才能使用子类的私有构造函数。
+		friend class Singleton<Parkspace_db_manager>;
+
+	public:
+		// 必须关闭拷贝构造和赋值构造,只能通过 get_instance 函数来进行操作唯一的实例。
+		Parkspace_db_manager(const Parkspace_db_manager &) = delete;
+		Parkspace_db_manager &operator=(const Parkspace_db_manager &) = delete;
+		~Parkspace_db_manager() ;
+
+		// 车位数据库管理初始化
+		Error_manager Parkspace_db_manager_init(parkspace_proto::database_config config);
+		// 车位数据库管理反初始化
+		Error_manager Parkspace_db_manager_uninit();
+		// 连接状态
+		bool is_connected();
+		// 初始化状态
+		bool is_initialized();
+		// ******** 数据库具体操作函数 *********
+		// 从数据库获得所有车位信息,用于车位模块初始化
+		Error_manager get_all_parkspace_info(message::Parkspace_allocation_status_msg &all_parkspace_info);
+		// 更新数据库中所有车位信息
+		Error_manager update_all_parkspace_info(message::Parkspace_allocation_status_msg all_parkspace_info);
+		// 更新数据库中车位状态
+		Error_manager update_parkspace_status(message::Parkspace_info parkspace_info);
+		// 更新数据库车辆状态,车位信息中包含车辆信息用于匹配更新
+		Error_manager update_vehicle_status(message::Parkspace_info parkspace_info, message::Vehicle_status &vehicle_status);
+		// 插入车辆
+		Error_manager insert_vehicle(message::Parkspace_info parkspace_info, message::Vehicle_status &vehicle_status);
+		// 插入停车记录
+		Error_manager insert_parking_record(message::Parkspace_info parkspace_info);
+		// 更新停车记录,待计费系统加入后完善!!!
+		Error_manager update_parking_record(message::Parkspace_info parkspace_info, int record_id);
+		// 根据车位编号查询车位状态
+		Error_manager query_parkspace(int parkspace_id, message::Parkspace_info &parkspace_info);
+		// 查询车辆状态,暂时不使用
+		Error_manager query_vehicle(std::string license, message::Vehicle_status &vehicle_status, int &park_record_id);
+		// 查询停车记录
+		Error_manager query_parking_record(message::Parkspace_info &parkspace_info, int &record_id);
+
+
+	private:
+		// 父类的构造函数必须保护,子类的构造函数必须私有。
+		Parkspace_db_manager();
+		// 数据库操作成员
+		Database_controller m_db_controller;
+
+		// 初始化状态
+		std::atomic_bool mb_initialized;
+		// 连接状态
+		std::atomic_bool mb_connected;
+	};
+
+
 
-public:
-    // 必须关闭拷贝构造和赋值构造,只能通过 get_instance 函数来进行操作唯一的实例。
-    Parkspace_db_manager(const Parkspace_db_manager &) = delete;
-    Parkspace_db_manager &operator=(const Parkspace_db_manager &) = delete;
-    ~Parkspace_db_manager() = default;
-    // 车位数据库管理初始化
-    Error_manager Parkspace_db_manager_init(parkspace_proto::database_config config);
-    // 车位数据库管理反初始化
-    Error_manager Parkspace_db_manager_uninit();
-    // 连接状态
-    bool is_connected();
-    // 初始化状态
-    bool is_initialized();
-    // ******** 数据库具体操作函数 *********
-    // 从数据库获得所有车位信息,用于车位模块初始化
-    Error_manager get_all_parkspace_info(message::Parkspace_allocation_status_msg &all_parkspace_info);
-    // 更新数据库中所有车位信息
-    Error_manager update_all_parkspace_info(message::Parkspace_allocation_status_msg all_parkspace_info);
-    // 更新数据库中车位状态
-    Error_manager update_parkspace_status(message::Parkspace_info parkspace_info);
-    // 更新数据库车辆状态,车位信息中包含车辆信息用于匹配更新
-    Error_manager update_vehicle_status(message::Parkspace_info parkspace_info, message::Vehicle_status &vehicle_status);
-    // 插入车辆
-    Error_manager insert_vehicle(message::Parkspace_info parkspace_info, message::Vehicle_status &vehicle_status);
-    // 插入停车记录
-    Error_manager insert_parking_record(message::Parkspace_info parkspace_info);
-    // 更新停车记录,待计费系统加入后完善!!!
-    Error_manager update_parking_record(message::Parkspace_info parkspace_info, int record_id);
-    // 根据车位编号查询车位状态
-    Error_manager query_parkspace(int parkspace_id, message::Parkspace_info &parkspace_info);
-    // 查询车辆状态,暂时不使用
-    Error_manager query_vehicle(std::string license, message::Vehicle_status &vehicle_status, int &park_record_id);
-    // 查询停车记录
-    Error_manager query_parking_record(message::Parkspace_info &parkspace_info, int &record_id);
 
-private:
-    // 父类的构造函数必须保护,子类的构造函数必须私有。
-    Parkspace_db_manager() = default;
-    // 数据库操作单例句柄
-    boost::shared_ptr<Database_controller> mp_db_controller;
-    // 初始化状态
-    std::atomic_bool mb_initialized;
-    // 连接状态
-    std::atomic_bool mb_connected;
-};
 
 #endif // !PARKSPACE_DB_MANAGER_HH

+ 1 - 1
setting/parkspace_config.prototxt

@@ -5,7 +5,7 @@ db_config
 {
     db_ip:"127.0.0.1",
     db_port:3306,
-    db_username:"yct",
+    db_username:"wk",
     db_passwd:"123456",
     db_name:"test",
     db_conn_pool_size:5

+ 97 - 39
test/db_test.cpp

@@ -6,49 +6,107 @@
  * @LastEditors: yct
  */ 
 
-#include "../parkspace_allocation/database_controller.h"
+#include "../parkspace_allocation/parkspace_db_manager.h"
+
 using std::cout;
 using std::endl;
 int main()
 {
-    Database_controller *db = Database_controller::get_instance_pointer();
-    db->database_controller_init("127.0.0.1", 3306, "yct", "123456", "test");
-    // usleep(1000*1000);
-    if(db->is_connected())
-    {
-        // 增加
-        Error_manager ec = db->sql_insert("INSERT INTO my_test (content) VALUES ('aaa')");
-        // usleep(1000*3000);
-        cout<<"insert: "<< ec.to_string() <<endl;
-        // 查询
-        boost::shared_ptr<sql::ResultSet> query_result = nullptr;
-        // cout<<"---"<<endl;
-        ec = db->sql_query("SELECT * FROM my_test where id < 5", query_result);
-        cout<<"search: "<< ec.to_string() <<endl;
-        while(query_result!=nullptr && query_result->next())
-        {
-            cout << query_result->getInt("id") << endl;
-            if(query_result->getString("content") != ""){
-                cout << query_result->getInt("numm") << endl;
-                cout << query_result->getString("content") << endl;
-            }
-        }
-        // 删除
-        ec = db->sql_delete("DELETE FROM my_test WHERE id=2");
-        cout<<"delete: "<< ec.to_string() <<endl;
-        // 修改
-        ec = db->sql_update("UPDATE my_test SET content='modified_12345' WHERE id=3");
-        cout<<"update: "<< ec.to_string() <<endl;
+	Parkspace_db_manager *db = Parkspace_db_manager::get_instance_pointer();
+	parkspace_proto::database_config ip;
+	ip.set_db_ip("127.0.0.1");
+	ip.set_db_port(3306);
+	ip.set_db_username("wk");
+	ip.set_db_passwd("123456");
+	ip.set_db_name("test");
+	ip.set_db_conn_pool_size(5);
+
+	Error_manager ec = db->Parkspace_db_manager_init(ip);
+	std::cout<<"init:"<<ec.to_string()<<std::endl;
 
-        for (size_t i = 0; i < 5; i++)
-        {
-            usleep(1000 * 5000);
-            ec = db->sql_query("SELECT id,content FROM my_test where id < 5", query_result);
-            cout << "search: " << ec.to_string() << endl;
-        }
-    }else{
-        cout<<"connection failed "<<endl;
-    }
-    getchar();
+	if ( db->is_connected() )
+	{
+
+		message::Parkspace_info parkspaceInfo;
+		message::Car_info carInfo;
+		carInfo.set_car_length(8);
+		carInfo.set_car_width(3);
+		carInfo.set_car_height(2);
+		carInfo.set_license("鄂WKWKs5");
+		parkspaceInfo.set_parkspace_id(14);
+		parkspaceInfo.set_index(20);
+		parkspaceInfo.set_direction(message::Direction::eBackward);
+		parkspaceInfo.set_floor(4);
+		parkspaceInfo.set_length(4);
+		parkspaceInfo.set_width(2);
+		parkspaceInfo.set_height(4);
+		parkspaceInfo.set_parkspace_status(message::Parkspace_status::eParkspace_error);
+		parkspaceInfo.set_allocated_car_info(&carInfo);
+		parkspaceInfo.set_entry_time("2020/10/14 16:42:12");
+		parkspaceInfo.set_leave_time("2020/10/15 16:44:22");
+		parkspaceInfo.set_block_id(5);
+		message::Vehicle_status vehicleStatus;
+		vehicleStatus = message::eVehicle_in_garage;
+		// 增加
+//		ec = db->insert_vehicle(parkspaceInfo, vehicleStatus);
+//		std::cout << "add:"<< " ec.to_string() = " << ec.to_string() << std::endl;
+//		ec = db->insert_parking_record(parkspaceInfo);
+//		std::cout << " add: " << ec << std::endl;
+		//查询车位
+//		message::Parkspace_info query_result;
+//		ec = db->query_parkspace(19, quSery_result);
+//		std::cout << "query:" << ec.to_string() << std::endl;
+//		if ( ec==SUCCESS)
+//		{
+//			std::cout <<query_result.DebugString()<<std::endl;
+//		}
+//		//查询车辆
+//		 message::Vehicle_status vehicleStatus;
+//		 int park_record_id;
+//		 ec=db->query_vehicle("闽WKA81",vehicleStatus,park_record_id);
+//		 std::cout<<" query_vehicle:"<<ec<<std::endl;
+//		if ( ec==SUCCESS )
+//		{
+//			std::cout << " park_record_id = " <<park_record_id << std::endl;
+//			std::cout << " vehicleStatus = " <<vehicleStatus << std::endl;
+//		}
+        // 修改
+//		ec = db->update_parkspace_status(parkspaceInfo);
+//		ec = db->update_vehicle_status(parkspaceInfo,vehicleStatus);
+//		cout<<"update: "<< ec.to_string() <<endl;
+	}
+//    if(db->mp_db_controller->is_connected())
+//    {
+//        // 增加
+//        Error_manager ec = db->mp_db_controller->sql_insert("INSERT INTO my_test (content) VALUES ('ccc')");
+//        // usleep(1000*3000);
+//        cout<<"insert: "<< ec.to_string() <<endl;
+//        // 查询
+//        boost::shared_ptr<sql::ResultSet> query_result = nullptr;
+//        // cout<<"---"<<endl;
+//        ec = db->mp_db_controller->sql_query("SELECT * FROM my_test where id < 27", query_result);
+//        cout<<"search: "<< ec.to_string() <<endl;
+//        while(query_result!=nullptr && query_result->next())
+//        {
+//            cout << query_result->getInt("id") << endl;
+//            if(query_result->getString("content") != ""){
+//                cout << query_result->getInt("numm") << endl;
+//                cout << query_result->getString("content") << endl;
+//            }
+//        }
+//        // 删除
+//        ec = db->mp_db_controller->sql_delete("DELETE FROM my_test WHERE id=2");
+//        cout<<"delete: "<< ec.to_string() <<endl;
+//        // 修改
+//        ec = db->mp_db_controller->sql_update("UPDATE my_test SET content='modified_12345' WHERE id=3");
+//        cout<<"update: "<< ec.to_string() <<endl;
+//
+//		std::cout<<"---"<<std::endl;
+//    }
+//    else
+//	{
+//        cout<<"connection failed "<<endl;
+//    }
+//    getchar();
     return 0;
 }

+ 36 - 37
test/parkspace_client.cpp

@@ -15,7 +15,7 @@
 #include "parkspace_allocation_message.pb.h"
 #include <thread>
 
-std::string send_allocation_request(int n)
+std::string send_allocation_request(int n,std::string license)
 {
     // 发送车位分配请求
     message::Error_manager error_code;
@@ -29,12 +29,12 @@ std::string send_allocation_request(int n)
     base_info.set_timeout_ms(2000);
     car_info.set_car_height(1.0);
     car_info.set_car_width(1.0);
-    car_info.set_license((std::string("鄂A1234")+std::to_string(n)).c_str());
+    car_info.set_license(license);
 
     request.mutable_base_info()->CopyFrom(base_info);
     message::Command_info cmd_info;
     cmd_info.set_time("12345");
-    cmd_info.set_location("aaaaaa");
+    cmd_info.set_location("wwwwwwkkkkk");
     cmd_info.set_event(message::Event::ePicking);
     request.mutable_command_info()->CopyFrom(cmd_info);
     request.set_terminal_id(n);
@@ -44,7 +44,7 @@ std::string send_allocation_request(int n)
     return request.SerializeAsString();
 }
 
-std::string send_search_requests(int n, std::string license="鄂A12345")
+std::string send_search_requests(std::string license)
 {
     // 发送车位查询请求
     message::Error_manager error_code;
@@ -71,10 +71,9 @@ std::string send_search_requests(int n, std::string license="鄂A12345")
     // socket.send(request.SerializeAsString());
     return request.SerializeAsString();
 }
-
-std::string send_release_request(int n)
+//发送车位释放请求
+std::string send_release_request(int n,std::string license)
 {
-    // 发送车位释放请求
     message::Error_manager error_code;
     message::Base_info base_info;
     message::Car_info car_info;
@@ -87,8 +86,8 @@ std::string send_release_request(int n)
     base_info.set_timeout_ms(2000);
     car_info.set_car_height(1.5);
     car_info.set_car_width(1.85);
-    car_info.set_license("鄂A12345");
-    space_info.set_parkspace_id(1);
+    car_info.set_license(license);
+    space_info.set_parkspace_id(n);
     space_info.set_index(1);
     space_info.set_direction(message::Direction::eForward);
     space_info.set_floor(33);
@@ -108,10 +107,9 @@ std::string send_release_request(int n)
     // socket.send(request.SerializeAsString());
     return request.SerializeAsString();
 }
-
-std::string send_confirm_request(int n)
+//发送车位确认请求
+std::string send_confirm_request(int n,std::string license )
 {
-    // 发送车位释放请求
     message::Error_manager error_code;
     message::Base_info base_info;
     message::Car_info car_info;
@@ -124,8 +122,8 @@ std::string send_confirm_request(int n)
     base_info.set_timeout_ms(2000);
     car_info.set_car_height(1.5);
     car_info.set_car_width(1.85);
-    car_info.set_license("鄂A12345");
-    space_info.set_parkspace_id(1);
+    car_info.set_license(license);
+    space_info.set_parkspace_id(n);
     space_info.set_index(1);
     space_info.set_direction(message::Direction::eForward);
     space_info.set_floor(33);
@@ -150,25 +148,26 @@ int main()
 {
     nnxx::socket socket{nnxx::SP, nnxx::BUS};
     // socket.bind("tcp://127.0.0.1:7000");
-    socket.connect("tcp://127.0.0.1:7001");
+   socket.connect("tcp://192.168.2.115:7001") ;
+   sleep(1);
     int n = 0;
     message::Base_msg base_msg;
-
-    usleep(1000 * 3000);
-
-    std::string alloc_req = send_allocation_request(0);
-    socket.send(alloc_req);
-    // usleep(1000 * 500);
-    alloc_req = send_allocation_request(1);
-    socket.send(alloc_req);
-    alloc_req = send_allocation_request(2);
-    socket.send(alloc_req);
-    alloc_req = send_allocation_request(3);
-    socket.send(alloc_req);
-    alloc_req = send_allocation_request(4);
-    socket.send(alloc_req);
-    alloc_req = send_allocation_request(5);
-    socket.send(alloc_req);
+    std::string alloc_req =send_release_request(1,"王wkwk21");
+	socket.send(alloc_req);
+//	alloc_req=send_search_requests("鄂WK2341");
+//
+//    socket.send(alloc_req);
+//    // usleep(1000 * 500);
+//    alloc_req = send_search_requests(1);
+//    socket.send(alloc_req);
+//    alloc_req = send_allocation_request(2);
+//    socket.send(alloc_req);
+//    alloc_req = send_allocation_request(3);
+//    socket.send(alloc_req);
+//    alloc_req = send_allocation_request(4);
+//    socket.send(alloc_req);
+//    alloc_req = send_allocation_request(5);
+//    socket.send(alloc_req);
 
     // std::string confirm_req = send_confirm_request(1);
     // socket.send(confirm_req);
@@ -202,7 +201,7 @@ int main()
         // std::string release_req = send_release_request(n);
         // socket.send(release_req);
         // usleep(1000*2000);
-
+        std::cout<<""<<std::endl;
         for (size_t i = 0; i < 5; i++)
         {
             // 接收消息
@@ -216,7 +215,7 @@ int main()
                 if (base_msg.base_info().msg_type() == message::Message_type::eParkspace_allocation_status_msg)
                 {
                     // message::Parkspace_allocation_status_msg parkspace_status;
-                    // std::cout << "----------------- 车位状态 -----------------" << std::endl;
+                    // std::cout << "-- 车位状态 --" << std::endl;
                     // parkspace_status.ParseFromString(t_receive_string);
                     // std::cout << parkspace_status.DebugString() << std::endl;
                     // continue;
@@ -225,28 +224,28 @@ int main()
                 {
                     message::Parkspace_allocation_response_msg response;
                     response.ParseFromString(t_receive_string);
-                    std::cout << "----------------- 分配车位结果 -----------------" << std::endl;
+                    std::cout << "-- 分配车位结果 --" << std::endl;
                     std::cout << response.DebugString() << std::endl;
                 }
                 else if (base_msg.base_info().msg_type() == message::Message_type::eParkspace_search_response_msg)
                 {
                     message::Parkspace_search_response_msg response;
                     response.ParseFromString(t_receive_string);
-                    std::cout << "----------------- 查询车辆位置结果 -----------------" << std::endl;
+                    std::cout << "-- 查询车辆位置结果 --" << std::endl;
                     std::cout << response.DebugString() << std::endl;
                 }
                 else if (base_msg.base_info().msg_type() == message::Message_type::eParkspace_release_response_msg)
                 {
                     message::Parkspace_release_response_msg response;
                     response.ParseFromString(t_receive_string);
-                    std::cout << "----------------- 释放车位结果 -----------------" << std::endl;
+                    std::cout << "-- 释放车位结果 --" << std::endl;
                     std::cout << response.DebugString() << std::endl;
                 }
                 else if (base_msg.base_info().msg_type() == message::Message_type::eParkspace_confirm_alloc_response_msg)
                 {
                     message::Parkspace_confirm_alloc_response_msg response;
                     response.ParseFromString(t_receive_string);
-                    std::cout << "----------------- 确认占用车位结果 -----------------" << std::endl;
+                    std::cout << "-- 确认占用车位结果 --" << std::endl;
                     std::cout << response.DebugString() << std::endl;
                 }
             }

+ 71 - 46
test/test_parkspace_sample.cpp

@@ -16,54 +16,77 @@ int main()
     google::InstallFailureSignalHandler();
     FLAGS_colorlogtostderr = true;
 
-    parkspace_proto::garage_config config;
+	parkspace_proto::garage_config config;//存放数据库连接信息
+	proto_tool::get_instance_references().read_proto_param("../setting/parkspace_config.prototxt", config);//从目标文件读取数据库连接信息
+	Parkspace_allocator::get_instance_references().parkspace_allocator_init(5, config);//初始化线程池
+	Parkspace_allocation_communicator *p_parkspace_allocation_communicater = Parkspace_allocation_communicator::get_instance_pointer();//获取通信的单例
+
+	p_parkspace_allocation_communicater->communication_bind("tcp://192.168.2.115:7001");//绑定地址
+	p_parkspace_allocation_communicater->communication_run();//启动
+	while(1)
+	{
+		sleep(1);
+	}
+	p_parkspace_allocation_communicater->communication_uninit();
+	Parkspace_allocator::get_instance_references().parkspace_allocator_uninit();
+
+
+
+
+//    parkspace_proto::garage_config config;
     // // parkspace_proto::database_config config;
-    // config.mutable_db_config()->set_db_ip("127.0.0.1");
-    // config.mutable_db_config()->set_db_port(3306);
-    // config.mutable_db_config()->set_db_username("yct");
-    // config.mutable_db_config()->set_db_passwd("123456");
-    // config.mutable_db_config()->set_db_name("test");
-    // config.mutable_db_config()->set_db_conn_pool_size(5);
-    // config.set_block_size(3);
-    // config.set_terminal_size_in_block(2);
-    proto_tool::get_instance_references().read_proto_param("../setting/parkspace_config.prototxt", config);
+//    // config.mutable_db_config()->set_db_ip("127.0.0.1");
+//    // config.mutable_db_config()->set_db_port(3306);
+//    // config.mutable_db_config()->set_db_username("yct");
+//    // config.mutable_db_config()->set_db_passwd("123456");
+//    // config.mutable_db_config()->set_db_name("test");
+//    // config.mutable_db_config()->set_db_conn_pool_size(5);
+//    // config.set_block_size(3);
+//    // config.set_terminal_size_in_block(2);
+//    proto_tool::get_instance_references().read_proto_param("../setting/parkspace_config.prototxt", config);
 
-    Parkspace_allocation_communicator *p_parkspace_allocation_communicater = Parkspace_allocation_communicator::get_instance_pointer();
-    Parkspace_allocator *p_parkspace_allocator = Parkspace_allocator::get_instance_pointer();
+//	Parkspace_allocator::get_instance_references().parkspace_allocator_init(5, config);
+
+
+//	Parkspace_db_manager& parkspaceDbManager=Parkspace_db_manager::get_instance_references();
+
+
+//    Parkspace_allocation_communicator *p_parkspace_allocation_communicater = Parkspace_allocation_communicator::get_instance_pointer();
+//    Parkspace_allocator *p_parkspace_allocator = Parkspace_allocator::get_instance_pointer();
+//
+//    p_parkspace_allocator->parkspace_allocator_init(4, config);
+//    p_parkspace_allocation_communicater->communication_bind("tcp://192.168.2.115:7001");
 
-    p_parkspace_allocator->parkspace_allocator_init(4, config);
-    p_parkspace_allocation_communicater->communication_bind("tcp://127.0.0.1:7001");
     // p_parkspace_allocation_communicater->communication_bind("tcp://192.168.2.125:7001");
     // p_parkspace_allocation_communicater->communication_connect("tcp://127.0.0.1:7000");
-    p_parkspace_allocation_communicater->communication_run();
-
-    // // 初始化车位,创建三个车位
-    // message::Parkspace_allocation_status_msg parkspace_status;
-    // for (size_t i = 1; i < 1000; i++)
-    // {
-    //     message::Parkspace_info* space = parkspace_status.add_parkspace_info();
-    //     space->set_parkspace_id(i);
-    //     space->set_index(i);
-    //     space->set_direction(message::Direction::eForward);
-    //     space->set_floor(2+i);
-    //     space->set_length(5.5);
-    //     space->set_width(2.2);
-    //     space->set_height(1.75);
-    //     space->set_parkspace_status(message::Parkspace_status::eParkspace_empty);
-    // }
-    // message::Base_info base_msg;
-    // message::Error_manager error;
-    // base_msg.set_msg_type(message::Message_type::eParkspace_allocation_response_msg);
-    // base_msg.set_timeout_ms(1000);
-    // base_msg.set_sender(message::Communicator::eParkspace);
-    // base_msg.set_receiver(message::Communicator::eMain);
-    // error.set_error_code(0);
-    // parkspace_status.mutable_base_info()->CopyFrom(base_msg);
-    // parkspace_status.mutable_error_manager()->CopyFrom(error);
-    // p_parkspace_allocation_communicater->update_parkspace_status(parkspace_status);
-    int k=1;
+//    p_parkspace_allocation_communicater->communication_run();
 
-    while(1) {
+     // 初始化车位,创建三个车位
+//     message::Parkspace_allocation_status_msg parkspace_status;
+//     for (size_t i = 1; i < 1000; i++)
+//     {
+//         message::Parkspace_info* space = parkspace_status.add_parkspace_info();
+//         space->set_parkspace_id(i);
+//         space->set_index(i);
+//         space->set_direction(message::Direction::eForward);
+//         space->set_floor(2+i);
+//         space->set_length(5.5);
+//         space->set_width(2.2);
+//         space->set_height(1.75);
+//         space->set_parkspace_status(message::Parkspace_status::eParkspace_empty);
+//     }
+//     message::Base_info base_msg;
+//     message::Error_manager error;
+//     base_msg.set_msg_type(message::Message_type::eParkspace_allocation_response_msg);
+//     base_msg.set_timeout_ms(1000);
+//     base_msg.set_sender(message::Communicator::eParkspace);
+//     base_msg.set_receiver(message::Communicator::eMain);
+//     error.set_error_code(0);
+//     parkspace_status.mutable_base_info()->CopyFrom(base_msg);
+//     parkspace_status.mutable_error_manager()->CopyFrom(error);
+//	parkspaceDbManager.update_all_parkspace_info(parkspace_status);
+//    int k=1;
+//    while(1) {
         // message::Parkspace_info space;
         // space.set_parkspace_id(3);
         // space.set_index(k);
@@ -74,9 +97,11 @@ int main()
         // space.set_height(k*400);
         // space.set_parkspace_status(message::Parkspace_status::eParkspace_occupied);
         // p_parkspace_allocator->update_parkspace_status(3, space);
-        usleep(1000*1000);
-        k++;
-    }
-    p_parkspace_allocator->parkspace_allocator_uninit();
+//        sleep(1);
+//        k++;
+//    }
+//	p_parkspace_allocation_communicater->communication_uninit();
+//	Parkspace_allocator::get_instance_references().parkspace_allocator_uninit();
+//    p_parkspace_allocator->parkspace_allocator_uninit();
     return 0;
 }

+ 2 - 2
tool/thread_condition.h

@@ -36,8 +36,7 @@
 #include <atomic>
 #include <mutex>
 #include <condition_variable>
-
-
+#include <functional>
 class Thread_condition
 {
 public:
@@ -115,6 +114,7 @@ private:
 template<typename _Rep, typename _Period>
 bool Thread_condition::wait_for_ex(const std::chrono::duration<_Rep, _Period>& time_duration)
 {
+
 	std::unique_lock<std::mutex> loc(m_mutex);
 	m_condition_variable.wait_for(loc, std::chrono::duration<_Rep, _Period>(time_duration), std::bind(is_pass_wait, this));
 	bool t_pass = is_pass_wait(this);