zxs 1 week ago
parent
commit
c640a45a41

+ 11 - 6
robot/robotics/event_wait_for.hpp

@@ -19,17 +19,22 @@ namespace robotics {
 	namespace v3 {
 	namespace v3 {
 		class event_wait_for {
 		class event_wait_for {
 		public:
 		public:
-			explicit event_wait_for() {
+			explicit event_wait_for():
+				notify_(false){
 			}
 			}
 			~event_wait_for() {
 			~event_wait_for() {
 				notify();
 				notify();
 			}
 			}
 			bool wait(std::uint32_t ms) {
 			bool wait(std::uint32_t ms) {
 				std::unique_lock<std::mutex> lock(mutex_);
 				std::unique_lock<std::mutex> lock(mutex_);
-				bool result = false;
-				cv_.wait_for(lock, std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::milliseconds(ms)), [this] {return notify_; });
-				result = notify_;
-				notify_ = false;
+				bool result = cv_.wait_for(lock, std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::milliseconds(ms)), [this] 
+					{
+						bool ret = notify_.load();
+						if (notify_) {
+							notify_ = false;
+						}
+						return ret;
+					});
 				return result;
 				return result;
 			}
 			}
 			void notify() {
 			void notify() {
@@ -47,7 +52,7 @@ namespace robotics {
 			}
 			}
 		private:
 		private:
 			std::any							user_data_;
 			std::any							user_data_;
-			bool								notify_ = false;
+			std::atomic<bool>					notify_;
 			std::mutex							mutex_;
 			std::mutex							mutex_;
 			std::condition_variable				cv_;
 			std::condition_variable				cv_;
 		};
 		};

+ 1 - 0
robot/robotics/nexus_net_client.hpp

@@ -922,6 +922,7 @@ namespace robotics {
              * @param data
              * @param data
              */
              */
             void on_publisher(nexus_net_message data) {
             void on_publisher(nexus_net_message data) {
+                REGISTER_ASYNC_FUNC(on_publisher, data);
                 if (3 != std::count(data.route.begin(), data.route.end(), '/')) {
                 if (3 != std::count(data.route.begin(), data.route.end(), '/')) {
                     return;
                     return;
                 }
                 }

+ 2 - 2
robot/robotics/singleton.hpp

@@ -19,7 +19,7 @@
 #endif
 #endif
 #ifdef SINGLETON
 #ifdef SINGLETON
 #else
 #else
-#define SINGLETON(value) {v3::singleton single; if (single.locker(value)) return 0;}
+#define SINGLETON(value) v3::singleton single; if (single.locker(value)) return 0;
 #endif // SINGLETON
 #endif // SINGLETON
 namespace robotics {
 namespace robotics {
     namespace v3 {
     namespace v3 {
@@ -29,7 +29,7 @@ namespace robotics {
             }
             }
             bool locker(std::string const& value) {
             bool locker(std::string const& value) {
 #ifdef WINDOWS_BUILD
 #ifdef WINDOWS_BUILD
-                mutex_ = CreateMutex(NULL, TRUE, value.c_str());
+                mutex_ = CreateMutexA(NULL, TRUE, value.c_str());
                 return GetLastError() == ERROR_ALREADY_EXISTS;
                 return GetLastError() == ERROR_ALREADY_EXISTS;
 #elif LINUX_BUILD
 #elif LINUX_BUILD
                 std::string file = "/tmp/" + value + ".lock";
                 std::string file = "/tmp/" + value + ".lock";

+ 47 - 32
robot/robotics/v2/nexus_net_client.hpp

@@ -2626,36 +2626,10 @@ namespace robotics::v2 {
             nexus_net_manager& manager_;
             nexus_net_manager& manager_;
         };
         };
     public:
     public:
-        //构造
-        nexus_net_multiple_client(nexus_net_client_xml_config const& config) :
-            nexus_net_multiple_client(config.name, config.client) {
-        }
-        //构造
-        nexus_net_multiple_client(std::string const& app_name, int client_size = 1) :
-            subscribe_name_(app_name) {
-            register_once();
-            client_.reset(new nexus_net_tcp_client(client_size));
-            message_invoke_.reset(new message_invoke(manager_));
-            client_->connect_event.bind(&nexus_net_multiple_client::on_connect, this);
-            client_->connect_fail_event.bind(&nexus_net_multiple_client::on_connect_fail, this);
-            client_->disconnect_event.bind(&nexus_net_multiple_client::on_disconnect, this);
-            client_->recv_event.bind(&nexus_net_multiple_client::on_recv, this);
-            message_invoke_->response_event.bind(&nexus_net_multiple_client::on_response, this);
-            timer_.timeout_event.bind(&nexus_net_multiple_client::on_heartbeat, this);
-        }
-        //构造
-        nexus_net_multiple_client(int clientSize = 1) {
-            auto config = nexus_net_xml_config::find_client();
-            if (!config.enable)
-                return;
-            subscribe_name_ = config.name;
-            register_once();
-            client_.reset(new nexus_net_tcp_client(clientSize));
-            client_->connect_event.bind(&nexus_net_multiple_client::on_connect, this);
-            client_->connect_fail_event.bind(&nexus_net_multiple_client::on_connect_fail, this);
-            client_->disconnect_event.bind(&nexus_net_multiple_client::on_disconnect, this);
-            client_->recv_event.bind(&nexus_net_multiple_client::on_recv, this);
-            timer_.timeout_event.bind(&nexus_net_multiple_client::on_heartbeat, this);
+        //单例
+        static nexus_net_multiple_client* instance() {
+            static nexus_net_multiple_client g_nexus_net_multiple_client;
+            return &g_nexus_net_multiple_client;
         }
         }
         //析构
         //析构
         ~nexus_net_multiple_client() {
         ~nexus_net_multiple_client() {
@@ -2680,7 +2654,7 @@ namespace robotics::v2 {
             auto config = nexus_net_xml_config::find_client();
             auto config = nexus_net_xml_config::find_client();
             if (!config.enable)
             if (!config.enable)
                 return false;
                 return false;
-            return start(config.ip, config.port);
+            return start(config.name, config.ip, config.port);
         }
         }
         //停止
         //停止
         void stop() {
         void stop() {
@@ -2765,9 +2739,17 @@ namespace robotics::v2 {
                 throw std::runtime_error("key禁用或不存在.");
                 throw std::runtime_error("key禁用或不存在.");
             manager_.add(std::pair(subscribe.group, subscribe.name), (typename v3::function_traits<_Fn>::stl_function_type)(std::bind_front(std::forward<_Fn>(fn), std::forward<_Ths>(ths))));
             manager_.add(std::pair(subscribe.group, subscribe.name), (typename v3::function_traits<_Fn>::stl_function_type)(std::bind_front(std::forward<_Fn>(fn), std::forward<_Ths>(ths))));
         }
         }
+        //订阅
+        template<typename _Fn, typename _This>
+        bool subscribe(std::string const& subscribe_key, _Fn&& fn, _This&& ths) {
+            auto subscribe = nexus_net_xml_config::find_subscribe(subscribe_key);
+            if (!subscribe.enable)
+                return false;
+            manager_.add(std::pair(subscribe.group, subscribe.name), (typename v3::function_traits<_Fn>::stl_function_type)(std::bind_front(std::forward<_Fn>(fn), std::forward<_Ths>(ths))));
+        }
         //调用
         //调用
         template<typename _Ret, typename ..._Args>
         template<typename _Ret, typename ..._Args>
-        _Ret config_call(std::string const& publishers_key, _Args &&...args) {
+        _Ret publisher(std::string const& publishers_key, _Args &&...args) {
             auto publishers = nexus_net_xml_config::find_publisher(publishers_key);
             auto publishers = nexus_net_xml_config::find_publisher(publishers_key);
             //遍历发布
             //遍历发布
             for (auto& it : publishers) {
             for (auto& it : publishers) {
@@ -3167,6 +3149,39 @@ namespace robotics::v2 {
             }
             }
         }
         }
     private:
     private:
+        //构造
+        nexus_net_multiple_client(nexus_net_client_xml_config const& config) :
+            nexus_net_multiple_client(config.name, config.client) {
+        }
+        //构造
+        nexus_net_multiple_client(std::string const& app_name, int client_size = 1) :
+            subscribe_name_(app_name) {
+            register_once();
+            client_.reset(new nexus_net_tcp_client(client_size));
+            message_invoke_.reset(new message_invoke(manager_));
+            client_->connect_event.bind(&nexus_net_multiple_client::on_connect, this);
+            client_->connect_fail_event.bind(&nexus_net_multiple_client::on_connect_fail, this);
+            client_->disconnect_event.bind(&nexus_net_multiple_client::on_disconnect, this);
+            client_->recv_event.bind(&nexus_net_multiple_client::on_recv, this);
+            message_invoke_->response_event.bind(&nexus_net_multiple_client::on_response, this);
+            timer_.timeout_event.bind(&nexus_net_multiple_client::on_heartbeat, this);
+        }
+        //构造
+        nexus_net_multiple_client(int clientSize = 1) {
+            auto config = nexus_net_xml_config::find_client();
+            if (!config.enable)
+                return;
+            subscribe_name_ = config.name;
+            register_once();
+            client_.reset(new nexus_net_tcp_client(clientSize));
+            message_invoke_.reset(new message_invoke(manager_));
+            client_->connect_event.bind(&nexus_net_multiple_client::on_connect, this);
+            client_->connect_fail_event.bind(&nexus_net_multiple_client::on_connect_fail, this);
+            client_->disconnect_event.bind(&nexus_net_multiple_client::on_disconnect, this);
+            client_->recv_event.bind(&nexus_net_multiple_client::on_recv, this);
+            message_invoke_->response_event.bind(&nexus_net_multiple_client::on_response, this);
+            timer_.timeout_event.bind(&nexus_net_multiple_client::on_heartbeat, this);
+        }
         //注册结构体
         //注册结构体
         void register_class() {
         void register_class() {
             rttr::registration::class_<struct nexus_net_node_app_info>("NexusNetNodeAppInfo").constructor<>()(rttr::detail::as_object{}).
             rttr::registration::class_<struct nexus_net_node_app_info>("NexusNetNodeAppInfo").constructor<>()(rttr::detail::as_object{}).