Browse Source

增加了输出 variable 是否为 nullptr 的功能

jcsyshc 2 years ago
parent
commit
08276364a0

+ 2 - 0
src/core/global_defs.cpp

@@ -47,6 +47,8 @@ namespace sophiar {
 #define REGISTER_VARIABLE_TYPE(var_type) \
         using var_type##_watcher = variable_debug_watcher<var_type>; \
         REGISTER_TYPE(var_type##_watcher); \
+        using var_type##_validity_watcher = variable_validity_watcher<var_type>; \
+        REGISTER_TYPE(var_type##_validity_watcher); \
         using var_type##_recorder = variable_recorder<var_type>; \
         REGISTER_TYPE(var_type##_recorder); \
         using var_type##_replayer = variable_replayer<var_type>; \

+ 36 - 0
src/utility/variable_utility.hpp

@@ -49,6 +49,39 @@ namespace sophiar {
         return std::move(worker);
     }
 
+    template<typename SmallObjType>
+    inline coro_worker::pointer variable_validity_watcher_func(const nlohmann::json &config) {
+        enum class status_type {
+            UNKNOWN,
+            VALID,
+            INVALID
+        };
+        std::string var_name;
+        auto var_index = LOAD_VARIABLE_INDEX_WITH_NAME(SmallObjType, "variable_name", var_name);
+        auto worker = make_infinite_coro_worker(
+                [=,
+                        status = status_type{},
+                        var_helper = VARIABLE_MANUAL_DELEGATE(SmallObjType, var_index)]() mutable
+                        -> awaitable<bool> {
+                    if (status != status_type::UNKNOWN) {
+                        co_await var_helper.coro_wait_update();
+                    } else {
+                        var_helper.manual_sync();
+                    }
+                    if (var_helper.empty()) {
+                        if (status == status_type::INVALID)[[likely]] co_return true;
+                        SPDLOG_DEBUG("{} becomes invalid.", var_name);
+                        status = status_type::INVALID;
+                    } else {
+                        if (status == status_type::VALID)[[likely]] co_return true;
+                        SPDLOG_DEBUG("{} becomes valid.", var_name);
+                        status = status_type::VALID;
+                    }
+                    co_return true;
+                });
+        return std::move(worker);
+    }
+
     template<typename SmallObjType>
     inline coro_worker::pointer variable_recorder_func(const nlohmann::json &config) {
         auto var_index = LOAD_VARIABLE_INDEX(SmallObjType, "variable_name");
@@ -113,6 +146,9 @@ namespace sophiar {
     template<typename SmallObjType>
     using variable_debug_watcher = simple_tristate_obj_wrapper<variable_debug_watcher_func<SmallObjType>>;
 
+    template<typename SmallObjType>
+    using variable_validity_watcher = simple_tristate_obj_wrapper<variable_validity_watcher_func<SmallObjType>>;
+
     template<typename SmallObjType>
     using variable_recorder = simple_tristate_obj_wrapper<variable_recorder_func<SmallObjType>>;
 

+ 9 - 1
tests/data/ndi_stabilizer_config.json

@@ -46,6 +46,13 @@
         "prefer_stream_tracking": true
       }
     },
+    {
+      "type": "transform_obj_validity_watcher",
+      "name": "probe_in_tracker_validity_watcher",
+      "start_config": {
+        "variable_name": "probe_in_tracker"
+      }
+    },
     {
       "type": "scalarxyz_transformer",
       "name": "probe_tip_transformer",
@@ -116,7 +123,8 @@
         "point_picker",
         "picked_point_watcher",
         "transform_picker",
-        "picked_transform_watcher"
+        "picked_transform_watcher",
+        "probe_in_tracker_validity_watcher"
       ]
     }
   ]