refactor: reorganize service and manager modules
This commit is contained in:
parent
f4be2ffaaa
commit
cb5f46c598
@ -6,15 +6,15 @@ add_subdirectory(hardware)
|
|||||||
add_subdirectory(algorithms)
|
add_subdirectory(algorithms)
|
||||||
add_subdirectory(simulate)
|
add_subdirectory(simulate)
|
||||||
add_subdirectory(devices)
|
add_subdirectory(devices)
|
||||||
add_subdirectory(manager/control_authority)
|
add_subdirectory(manager/control_authority_manager)
|
||||||
add_subdirectory(manager/safety)
|
add_subdirectory(manager/safety_manager)
|
||||||
add_subdirectory(manager/device_manager)
|
add_subdirectory(manager/device_manager)
|
||||||
add_subdirectory(service/stop_all)
|
add_subdirectory(service/grpc/stop_all)
|
||||||
add_subdirectory(manager/media_source_hub)
|
add_subdirectory(manager/media_source_manager)
|
||||||
add_subdirectory(service/quic_edge)
|
add_subdirectory(service/quic_edge)
|
||||||
add_subdirectory(service/arm_teleop_client)
|
|
||||||
add_subdirectory(task)
|
add_subdirectory(task)
|
||||||
add_subdirectory(task/quic_edge_task)
|
add_subdirectory(task/quic_edge_task)
|
||||||
|
add_subdirectory(service/grpc/client)
|
||||||
add_subdirectory(task/ume_teleop_task)
|
add_subdirectory(task/ume_teleop_task)
|
||||||
add_subdirectory(manager/task_manager)
|
add_subdirectory(manager/task_manager)
|
||||||
add_subdirectory(service)
|
add_subdirectory(service)
|
||||||
|
|||||||
@ -54,7 +54,7 @@ AGV 通用类型应参考 [`types/agv/agv_types.h`](types/agv/agv_types.h),机
|
|||||||
- AAC、Opus、PCM 明确 payload format、采样率和声道数;
|
- AAC、Opus、PCM 明确 payload format、采样率和声道数;
|
||||||
- 不把 QUIC、gRPC 或浏览器专有字段加入通用帧。
|
- 不把 QUIC、gRPC 或浏览器专有字段加入通用帧。
|
||||||
|
|
||||||
设备媒体接入流程见 [`../manager/README.md`](../manager/README.md) 的 MediaSourceHub 章节。
|
设备媒体接入流程见 [`../manager/README.md`](../manager/README.md) 的 MediaSourceManager 章节。
|
||||||
|
|
||||||
## 环形队列选择
|
## 环形队列选择
|
||||||
|
|
||||||
|
|||||||
@ -222,7 +222,7 @@ CameraDeviceConfig / AGVDeviceConfig / ... 的外层 id
|
|||||||
|
|
||||||
## 摄像头与麦克风实时流
|
## 摄像头与麦克风实时流
|
||||||
|
|
||||||
设备实现抽象流接口后,由 [`../manager/media_source_hub/`](../manager/media_source_hub/) 适配给 gRPC 和 QUIC,不应在设备后端实现两套协议代码。
|
设备实现抽象流接口后,由 [`../manager/media_source_manager/`](../manager/media_source_manager/) 适配给 gRPC 和 QUIC,不应在设备后端实现两套协议代码。
|
||||||
|
|
||||||
当前 Hub 轨道:
|
当前 Hub 轨道:
|
||||||
|
|
||||||
@ -312,7 +312,7 @@ adapter 检测到描述变化后创建新 descriptor,设备后端不要自行
|
|||||||
- 满队列覆盖旧数据是实时媒体的预期行为;
|
- 满队列覆盖旧数据是实时媒体的预期行为;
|
||||||
- `waitEncodedFrame()` 必须有有限 timeout,不能永久阻塞。
|
- `waitEncodedFrame()` 必须有有限 timeout,不能永久阻塞。
|
||||||
|
|
||||||
MediaSourceHub Subscription 同样是单消费者对象,不同协议或客户端必须各自订阅。
|
MediaSourceManager Subscription 同样是单消费者对象,不同协议或客户端必须各自订阅。
|
||||||
|
|
||||||
发布后的 `MediaFrame`、`TrackDescriptor` 和 payload 不可再修改。
|
发布后的 `MediaFrame`、`TrackDescriptor` 和 payload 不可再修改。
|
||||||
|
|
||||||
@ -334,19 +334,19 @@ MediaSourceHub Subscription 同样是单消费者对象,不同协议或客户
|
|||||||
无硬件参考测试:
|
无硬件参考测试:
|
||||||
|
|
||||||
- [`camera/hikvision_camera/tests/hikvision_camera_callback_test.cpp`](camera/hikvision_camera/tests/hikvision_camera_callback_test.cpp)
|
- [`camera/hikvision_camera/tests/hikvision_camera_callback_test.cpp`](camera/hikvision_camera/tests/hikvision_camera_callback_test.cpp)
|
||||||
- [`../manager/media_source_hub/tests/media_source_hub_test.cpp`](../manager/media_source_hub/tests/media_source_hub_test.cpp)
|
- [`../manager/media_source_manager/tests/media_source_manager_test.cpp`](../manager/media_source_manager/tests/media_source_manager_test.cpp)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cmake -S . -B build \
|
cmake -S . -B build \
|
||||||
-DCMVR_ARCH=x86 \
|
-DCMVR_ARCH=x86 \
|
||||||
-DBUILD_TESTING=ON \
|
-DBUILD_TESTING=ON \
|
||||||
-DCMVR_MEDIA_SOURCE_HUB_BUILD_TESTS=ON
|
-DCMVR_MEDIA_SOURCE_MANAGER_BUILD_TESTS=ON
|
||||||
|
|
||||||
cmake --build build -j"$(nproc)"
|
cmake --build build -j"$(nproc)"
|
||||||
|
|
||||||
ctest \
|
ctest \
|
||||||
--test-dir build \
|
--test-dir build \
|
||||||
-R 'hikvision_camera_callback_test|media_source_hub_test' \
|
-R 'hikvision_camera_callback_test|media_source_manager_test' \
|
||||||
--output-on-failure
|
--output-on-failure
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@ -17,7 +17,7 @@
|
|||||||
- DeviceManager 配置:
|
- DeviceManager 配置:
|
||||||
[`../../../config/manager/device_manager.pb.txt`](../../../config/manager/device_manager.pb.txt)
|
[`../../../config/manager/device_manager.pb.txt`](../../../config/manager/device_manager.pb.txt)
|
||||||
- ArmService 实现:
|
- ArmService 实现:
|
||||||
[`../../../service/grpc/src/grpc_arm_service.cpp`](../../../service/grpc/src/grpc_arm_service.cpp)
|
[`../../../service/grpc/server/src/grpc_arm_service.cpp`](../../../service/grpc/server/src/grpc_arm_service.cpp)
|
||||||
- Proto:[`../../../../protos/cmvr/api/arm_service.proto`](../../../../protos/cmvr/api/arm_service.proto)
|
- Proto:[`../../../../protos/cmvr/api/arm_service.proto`](../../../../protos/cmvr/api/arm_service.proto)
|
||||||
|
|
||||||
仓库配置使用 SDK RPC 端口 `30004`。现场部署必须填写真实控制器地址和凭据,
|
仓库配置使用 SDK RPC 端口 `30004`。现场部署必须填写真实控制器地址和凭据,
|
||||||
|
|||||||
@ -6,13 +6,20 @@
|
|||||||
|
|
||||||
## 当前管理器
|
## 当前管理器
|
||||||
|
|
||||||
|
管理模块目录统一使用 `*_manager` 后缀,主管理类使用 `*Manager` 后缀。工厂、适配器、
|
||||||
|
账本、快照和结果结构体属于管理器内部的支撑类型,保留其职责名称,不强行改成
|
||||||
|
`*Manager`。
|
||||||
|
|
||||||
| 目录 | CMake target | 职责 |
|
| 目录 | CMake target | 职责 |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
|
| [`control_authority_manager/`](control_authority_manager/) | `cmvr_es::control_authority_manager` | 控制权租约、代际、dispatch fence 和 quarantine |
|
||||||
| [`device_manager/`](device_manager/) | `cmvr_es::device_manager` | 按配置创建、初始化、查询和批量启停设备 |
|
| [`device_manager/`](device_manager/) | `cmvr_es::device_manager` | 按配置创建、初始化、查询和批量启停设备 |
|
||||||
|
| [`safety_manager/`](safety_manager/) | `cmvr_es::safety_manager` | Sensor/Control 安全准入、StopAll、恢复和命令账本 |
|
||||||
| [`task_manager/`](task_manager/) | `cmvr_es::task_manager` | 创建任务、校验运行模式、统一启停和调度周期任务 |
|
| [`task_manager/`](task_manager/) | `cmvr_es::task_manager` | 创建任务、校验运行模式、统一启停和调度周期任务 |
|
||||||
| [`media_source_hub/`](media_source_hub/) | `cmvr_es::media_source_hub`、`cmvr_es::device_media_source_adapter` | 实时媒体源注册、按需启停和多消费者分发 |
|
| [`media_source_manager/`](media_source_manager/) | `cmvr_es::media_source_manager`、`cmvr_es::device_media_source_adapter` | 实时媒体源注册、按需启停和多消费者分发 |
|
||||||
|
|
||||||
`manager/` 当前没有聚合 `CMakeLists.txt`,三个子目录由 [`../CMakeLists.txt`](../CMakeLists.txt) 分别加入。新增 manager 时必须显式更新该文件。
|
`manager/` 当前没有聚合 `CMakeLists.txt`,所有模块由 [`../CMakeLists.txt`](../CMakeLists.txt)
|
||||||
|
按依赖顺序加入。新增 manager 时必须同时更新目录、target、依赖顺序和本 README。
|
||||||
|
|
||||||
## 进程生命周期
|
## 进程生命周期
|
||||||
|
|
||||||
@ -136,12 +143,12 @@
|
|||||||
- 有顺序依赖的工作应放入同一协调任务或显式建模;
|
- 有顺序依赖的工作应放入同一协调任务或显式建模;
|
||||||
- task 返回后,其内部状态并发安全由具体实现负责。
|
- task 返回后,其内部状态并发安全由具体实现负责。
|
||||||
|
|
||||||
## MediaSourceHub
|
## MediaSourceManager
|
||||||
|
|
||||||
关键文件:
|
关键文件:
|
||||||
|
|
||||||
- [`media_source_hub/include/media_source_hub.h`](media_source_hub/include/media_source_hub.h)
|
- [`media_source_manager/include/media_source_manager.h`](media_source_manager/include/media_source_manager.h)
|
||||||
- [`media_source_hub/src/device_media_source_adapter.cpp`](media_source_hub/src/device_media_source_adapter.cpp)
|
- [`media_source_manager/src/device_media_source_adapter.cpp`](media_source_manager/src/device_media_source_adapter.cpp)
|
||||||
- [`../common/media/media_frame.h`](../common/media/media_frame.h)
|
- [`../common/media/media_frame.h`](../common/media/media_frame.h)
|
||||||
- [`../common/base/ring_buffer.h`](../common/base/ring_buffer.h)
|
- [`../common/base/ring_buffer.h`](../common/base/ring_buffer.h)
|
||||||
|
|
||||||
@ -152,7 +159,8 @@
|
|||||||
| 摄像头彩色流 | `<device_id>/video/color` | 64 |
|
| 摄像头彩色流 | `<device_id>/video/color` | 64 |
|
||||||
| 麦克风主流 | `<device_id>/audio/main` | 256 |
|
| 麦克风主流 | `<device_id>/audio/main` | 256 |
|
||||||
|
|
||||||
当前 gRPC RGB/麦克风流和 QUIC 彩色/麦克风轨道使用 Hub;gRPC Depth/RGBD 仍直接读取设备帧。
|
当前 gRPC RGB/麦克风流和 QUIC 彩色/麦克风轨道使用 MediaSourceManager;gRPC Depth/RGBD
|
||||||
|
仍直接读取设备帧。
|
||||||
|
|
||||||
### 注册新媒体源
|
### 注册新媒体源
|
||||||
|
|
||||||
@ -211,7 +219,7 @@ ring generation 不等于 `TrackDescriptor::generation`,ring 的 `ReadResult.s
|
|||||||
|
|
||||||
## 新增第四种 Manager
|
## 新增第四种 Manager
|
||||||
|
|
||||||
1. 先确认能力不是 DeviceManager、TaskManager 或 MediaSourceHub 的子职责;
|
1. 先确认能力不是 DeviceManager、TaskManager 或 MediaSourceManager 的子职责;
|
||||||
2. 定义所有权、初始化、start/stop 和线程模型;
|
2. 定义所有权、初始化、start/stop 和线程模型;
|
||||||
3. 避免新增无必要的全局单例;
|
3. 避免新增无必要的全局单例;
|
||||||
4. 新建独立目录、头文件、实现和 CMake target;
|
4. 新建独立目录、头文件、实现和 CMake target;
|
||||||
@ -221,13 +229,13 @@ ring generation 不等于 `TrackDescriptor::generation`,ring 的 `ReadResult.s
|
|||||||
|
|
||||||
## 测试
|
## 测试
|
||||||
|
|
||||||
MediaSourceHub:
|
MediaSourceManager:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cmake --build build --target media_source_hub_test
|
cmake --build build --target media_source_manager_test
|
||||||
ctest \
|
ctest \
|
||||||
--test-dir build \
|
--test-dir build \
|
||||||
-R '^media_source_hub_test$' \
|
-R '^media_source_manager_test$' \
|
||||||
--output-on-failure
|
--output-on-failure
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@ -1,17 +1,17 @@
|
|||||||
add_library(control_authority STATIC
|
add_library(control_authority_manager STATIC
|
||||||
src/control_authority_manager.cpp
|
src/control_authority_manager.cpp
|
||||||
)
|
)
|
||||||
target_compile_features(control_authority PUBLIC cxx_std_17)
|
target_compile_features(control_authority_manager PUBLIC cxx_std_17)
|
||||||
target_include_directories(control_authority
|
target_include_directories(control_authority_manager
|
||||||
PUBLIC
|
PUBLIC
|
||||||
${PROJECT_SOURCE_DIR}/cmvr-es
|
${PROJECT_SOURCE_DIR}/cmvr-es
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(
|
add_library(
|
||||||
cmvr_es::control_authority
|
cmvr_es::control_authority_manager
|
||||||
ALIAS control_authority
|
ALIAS control_authority_manager
|
||||||
)
|
)
|
||||||
install(TARGETS control_authority ARCHIVE DESTINATION lib)
|
install(TARGETS control_authority_manager ARCHIVE DESTINATION lib)
|
||||||
|
|
||||||
if(BUILD_TESTING)
|
if(BUILD_TESTING)
|
||||||
add_executable(control_authority_manager_test
|
add_executable(control_authority_manager_test
|
||||||
@ -19,7 +19,7 @@ if(BUILD_TESTING)
|
|||||||
)
|
)
|
||||||
target_link_libraries(control_authority_manager_test
|
target_link_libraries(control_authority_manager_test
|
||||||
PRIVATE
|
PRIVATE
|
||||||
cmvr_es::control_authority
|
cmvr_es::control_authority_manager
|
||||||
gtest
|
gtest
|
||||||
gtest_main
|
gtest_main
|
||||||
pthread
|
pthread
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "manager/control_authority/include/control_authority_manager.h"
|
#include "manager/control_authority_manager/include/control_authority_manager.h"
|
||||||
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "manager/control_authority/include/control_authority_manager.h"
|
#include "manager/control_authority_manager/include/control_authority_manager.h"
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <future>
|
#include <future>
|
||||||
@ -8,7 +8,7 @@ target_include_directories(device_manager PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
|||||||
|
|
||||||
target_link_libraries(device_manager PRIVATE
|
target_link_libraries(device_manager PRIVATE
|
||||||
cmvr_es::proto
|
cmvr_es::proto
|
||||||
cmvr_es::safety_coordinator
|
cmvr_es::safety_manager
|
||||||
cmvr_es::device::camera
|
cmvr_es::device::camera
|
||||||
cmvr_es::device::agv
|
cmvr_es::device::agv
|
||||||
cmvr_es::device::speaker
|
cmvr_es::device::speaker
|
||||||
|
|||||||
@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
#include "device_factory.h"
|
#include "device_factory.h"
|
||||||
#include "cmvr/config/device_manager_config/device_manager_config.pb.h"
|
#include "cmvr/config/device_manager_config/device_manager_config.pb.h"
|
||||||
#include "manager/safety/include/safety_coordinator.h"
|
#include "manager/safety_manager/include/safety_manager.h"
|
||||||
|
|
||||||
namespace cmvr::device {
|
namespace cmvr::device {
|
||||||
|
|
||||||
@ -48,13 +48,13 @@ namespace cmvr::device {
|
|||||||
std::vector<DeviceInventoryEntry> inventorySnapshot() const;
|
std::vector<DeviceInventoryEntry> inventorySnapshot() const;
|
||||||
DeviceManagerSnapshot snapshot() const;
|
DeviceManagerSnapshot snapshot() const;
|
||||||
|
|
||||||
safety::SafetyCoordinator& safetyCoordinator() noexcept
|
safety::SafetyManager& safetyManager() noexcept
|
||||||
{
|
{
|
||||||
return *safety_coordinator_;
|
return *safety_manager_;
|
||||||
}
|
}
|
||||||
const safety::SafetyCoordinator& safetyCoordinator() const noexcept
|
const safety::SafetyManager& safetyManager() const noexcept
|
||||||
{
|
{
|
||||||
return *safety_coordinator_;
|
return *safety_manager_;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string version() const;
|
std::string version() const;
|
||||||
@ -74,7 +74,7 @@ namespace cmvr::device {
|
|||||||
std::unordered_map<std::string, DeviceRecord> devices_;
|
std::unordered_map<std::string, DeviceRecord> devices_;
|
||||||
std::unordered_map<std::string, ManagedDeviceSnapshot> device_statuses_;
|
std::unordered_map<std::string, ManagedDeviceSnapshot> device_statuses_;
|
||||||
std::unique_ptr<DeviceFactory> dev_factory_;
|
std::unique_ptr<DeviceFactory> dev_factory_;
|
||||||
std::unique_ptr<safety::SafetyCoordinator> safety_coordinator_;
|
std::unique_ptr<safety::SafetyManager> safety_manager_;
|
||||||
bool initialized_{false};
|
bool initialized_{false};
|
||||||
|
|
||||||
explicit DeviceManager(const config::DeviceManagerConfig &cfg);
|
explicit DeviceManager(const config::DeviceManagerConfig &cfg);
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include "devices/abstract_device.h"
|
#include "devices/abstract_device.h"
|
||||||
#include "manager/safety/include/safety_participant.h"
|
#include "manager/safety_manager/include/safety_participant.h"
|
||||||
|
|
||||||
namespace cmvr::device {
|
namespace cmvr::device {
|
||||||
|
|
||||||
|
|||||||
@ -38,10 +38,10 @@ using MotorJointSelections = std::unordered_map<std::string, GroupJointSelection
|
|||||||
constexpr std::size_t kMaxDeviceErrorLength = 512;
|
constexpr std::size_t kMaxDeviceErrorLength = 512;
|
||||||
constexpr auto kSafetyStartupValidationTimeout = std::chrono::seconds(2);
|
constexpr auto kSafetyStartupValidationTimeout = std::chrono::seconds(2);
|
||||||
|
|
||||||
cmvr::safety::SafetyCoordinatorConfig safetyConfigFrom(
|
cmvr::safety::SafetyManagerConfig safetyConfigFrom(
|
||||||
const cmvr::config::DeviceManagerConfig& config)
|
const cmvr::config::DeviceManagerConfig& config)
|
||||||
{
|
{
|
||||||
cmvr::safety::SafetyCoordinatorConfig result;
|
cmvr::safety::SafetyManagerConfig result;
|
||||||
if (!config.has_safety()) {
|
if (!config.has_safety()) {
|
||||||
result.enforcement_mode = cmvr::safety::EnforcementMode::Shadow;
|
result.enforcement_mode = cmvr::safety::EnforcementMode::Shadow;
|
||||||
return result;
|
return result;
|
||||||
@ -49,18 +49,18 @@ cmvr::safety::SafetyCoordinatorConfig safetyConfigFrom(
|
|||||||
|
|
||||||
const auto& source = config.safety();
|
const auto& source = config.safety();
|
||||||
switch (source.mode()) {
|
switch (source.mode()) {
|
||||||
case cmvr::config::SafetyCoordinatorConfig::LEGACY:
|
case cmvr::config::SafetyManagerConfig::LEGACY:
|
||||||
result.enforcement_mode = cmvr::safety::EnforcementMode::Legacy;
|
result.enforcement_mode = cmvr::safety::EnforcementMode::Legacy;
|
||||||
break;
|
break;
|
||||||
case cmvr::config::SafetyCoordinatorConfig::ENFORCE_SELECTED:
|
case cmvr::config::SafetyManagerConfig::ENFORCE_SELECTED:
|
||||||
result.enforcement_mode =
|
result.enforcement_mode =
|
||||||
cmvr::safety::EnforcementMode::EnforceSelected;
|
cmvr::safety::EnforcementMode::EnforceSelected;
|
||||||
break;
|
break;
|
||||||
case cmvr::config::SafetyCoordinatorConfig::ENFORCE_ALL:
|
case cmvr::config::SafetyManagerConfig::ENFORCE_ALL:
|
||||||
result.enforcement_mode = cmvr::safety::EnforcementMode::EnforceAll;
|
result.enforcement_mode = cmvr::safety::EnforcementMode::EnforceAll;
|
||||||
break;
|
break;
|
||||||
case cmvr::config::SafetyCoordinatorConfig::SHADOW:
|
case cmvr::config::SafetyManagerConfig::SHADOW:
|
||||||
case cmvr::config::SafetyCoordinatorConfig::ENFORCEMENT_MODE_UNSPECIFIED:
|
case cmvr::config::SafetyManagerConfig::ENFORCEMENT_MODE_UNSPECIFIED:
|
||||||
default:
|
default:
|
||||||
result.enforcement_mode = cmvr::safety::EnforcementMode::Shadow;
|
result.enforcement_mode = cmvr::safety::EnforcementMode::Shadow;
|
||||||
break;
|
break;
|
||||||
@ -236,7 +236,7 @@ std::mutex DeviceManager::init_mutex_;
|
|||||||
DeviceManager::DeviceManager(const config::DeviceManagerConfig& cfg)
|
DeviceManager::DeviceManager(const config::DeviceManagerConfig& cfg)
|
||||||
: cfg_(cfg),
|
: cfg_(cfg),
|
||||||
dev_factory_(std::make_unique<DeviceFactory>()),
|
dev_factory_(std::make_unique<DeviceFactory>()),
|
||||||
safety_coordinator_(std::make_unique<safety::SafetyCoordinator>(
|
safety_manager_(std::make_unique<safety::SafetyManager>(
|
||||||
safetyConfigFrom(cfg)))
|
safetyConfigFrom(cfg)))
|
||||||
{
|
{
|
||||||
initialize_device_statuses_();
|
initialize_device_statuses_();
|
||||||
@ -313,7 +313,7 @@ bool DeviceManager::start(){
|
|||||||
bool started = false;
|
bool started = false;
|
||||||
std::string error_message;
|
std::string error_message;
|
||||||
try {
|
try {
|
||||||
(void)safety_coordinator_->advanceDeviceGeneration(id);
|
(void)safety_manager_->advanceDeviceGeneration(id);
|
||||||
started = device->start();
|
started = device->start();
|
||||||
if (!started) {
|
if (!started) {
|
||||||
error_message = "device start returned false: " + id;
|
error_message = "device start returned false: " + id;
|
||||||
@ -342,7 +342,7 @@ bool DeviceManager::start(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (all_started) {
|
if (all_started) {
|
||||||
const auto coverage = safety_coordinator_->validateStartupCoverage(
|
const auto coverage = safety_manager_->validateStartupCoverage(
|
||||||
safety::SafetyClock::now() + kSafetyStartupValidationTimeout);
|
safety::SafetyClock::now() + kSafetyStartupValidationTimeout);
|
||||||
if (!coverage.ready) {
|
if (!coverage.ready) {
|
||||||
all_started = false;
|
all_started = false;
|
||||||
@ -363,7 +363,7 @@ bool DeviceManager::start(){
|
|||||||
// explicit stop() records Stopped/Error transitions.
|
// explicit stop() records Stopped/Error transitions.
|
||||||
stop_devices_(false);
|
stop_devices_(false);
|
||||||
} else {
|
} else {
|
||||||
safety_coordinator_->markStartupComplete();
|
safety_manager_->markStartupComplete();
|
||||||
}
|
}
|
||||||
return all_started;
|
return all_started;
|
||||||
}
|
}
|
||||||
@ -422,7 +422,7 @@ void DeviceManager::stop_devices_(const bool update_status) {
|
|||||||
update_device_status_(id, ManagedDeviceState::Stopped);
|
update_device_status_(id, ManagedDeviceState::Stopped);
|
||||||
}
|
}
|
||||||
CMVR_LOG(INFO) << "[DeviceManager]: Stop device " << id << " Success";
|
CMVR_LOG(INFO) << "[DeviceManager]: Stop device " << id << " Success";
|
||||||
safety_coordinator_->updateDeviceRuntimeState(
|
safety_manager_->updateDeviceRuntimeState(
|
||||||
id, ManagedDeviceState::Stopped,
|
id, ManagedDeviceState::Stopped,
|
||||||
sample_device_health_(device));
|
sample_device_health_(device));
|
||||||
} else {
|
} else {
|
||||||
@ -431,7 +431,7 @@ void DeviceManager::stop_devices_(const bool update_status) {
|
|||||||
id, ManagedDeviceState::Error, error_message);
|
id, ManagedDeviceState::Error, error_message);
|
||||||
}
|
}
|
||||||
CMVR_LOG(ERROR) << "[DeviceManager]: Stop device " << id << " Failed";
|
CMVR_LOG(ERROR) << "[DeviceManager]: Stop device " << id << " Failed";
|
||||||
safety_coordinator_->updateDeviceRuntimeState(
|
safety_manager_->updateDeviceRuntimeState(
|
||||||
id, ManagedDeviceState::Error,
|
id, ManagedDeviceState::Error,
|
||||||
{DeviceHealthState::Fault, error_message});
|
{DeviceHealthState::Fault, error_message});
|
||||||
}
|
}
|
||||||
@ -634,7 +634,7 @@ void DeviceManager::update_device_status_(
|
|||||||
status.status_updated_at_unix_ms = unixTimeMs();
|
status.status_updated_at_unix_ms = unixTimeMs();
|
||||||
health = status.health;
|
health = status.health;
|
||||||
}
|
}
|
||||||
safety_coordinator_->updateDeviceRuntimeState(device_id, state, health);
|
safety_manager_->updateDeviceRuntimeState(device_id, state, health);
|
||||||
}
|
}
|
||||||
|
|
||||||
DeviceManagerSnapshot DeviceManager::snapshot() const
|
DeviceManagerSnapshot DeviceManager::snapshot() const
|
||||||
@ -724,7 +724,7 @@ void DeviceManager::update_device_health_(
|
|||||||
status.status_updated_at_unix_ms = unixTimeMs();
|
status.status_updated_at_unix_ms = unixTimeMs();
|
||||||
health = status.health;
|
health = status.health;
|
||||||
}
|
}
|
||||||
safety_coordinator_->updateDeviceRuntimeState(
|
safety_manager_->updateDeviceRuntimeState(
|
||||||
device_id, lifecycle, std::move(health));
|
device_id, lifecycle, std::move(health));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -750,7 +750,7 @@ bool DeviceManager::register_device_safety_(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
const bool registered =
|
const bool registered =
|
||||||
safety_coordinator_->registerDevice(std::move(registration));
|
safety_manager_->registerDevice(std::move(registration));
|
||||||
return registered;
|
return registered;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -21,8 +21,8 @@
|
|||||||
#include "devices/microphone/abstract_microphone.h"
|
#include "devices/microphone/abstract_microphone.h"
|
||||||
#include "devices/motor/manager/include/motor_manager.h"
|
#include "devices/motor/manager/include/motor_manager.h"
|
||||||
#include "devices/speaker/abstract_speaker.h"
|
#include "devices/speaker/abstract_speaker.h"
|
||||||
#include "manager/control_authority/include/control_authority_manager.h"
|
#include "manager/control_authority_manager/include/control_authority_manager.h"
|
||||||
#include "manager/safety/include/device_safety_endpoint.h"
|
#include "manager/safety_manager/include/device_safety_endpoint.h"
|
||||||
|
|
||||||
namespace cmvr::device {
|
namespace cmvr::device {
|
||||||
|
|
||||||
|
|||||||
@ -127,14 +127,14 @@ TEST_F(DeviceManagerLifecycleTest,
|
|||||||
cmvr::config::DeviceManagerConfig config;
|
cmvr::config::DeviceManagerConfig config;
|
||||||
auto* safety = config.mutable_safety();
|
auto* safety = config.mutable_safety();
|
||||||
safety->set_mode(
|
safety->set_mode(
|
||||||
cmvr::config::SafetyCoordinatorConfig::ENFORCE_SELECTED);
|
cmvr::config::SafetyManagerConfig::ENFORCE_SELECTED);
|
||||||
safety->add_enforced_device_ids("missing-arm");
|
safety->add_enforced_device_ids("missing-arm");
|
||||||
|
|
||||||
auto& manager = cmvr::device::DeviceManager::getInstance(config);
|
auto& manager = cmvr::device::DeviceManager::getInstance(config);
|
||||||
ASSERT_TRUE(manager.initialized());
|
ASSERT_TRUE(manager.initialized());
|
||||||
EXPECT_FALSE(manager.start());
|
EXPECT_FALSE(manager.start());
|
||||||
EXPECT_EQ(
|
EXPECT_EQ(
|
||||||
manager.safetyCoordinator().snapshot().system_state,
|
manager.safetyManager().snapshot().system_state,
|
||||||
cmvr::safety::SystemAdmissionState::Starting);
|
cmvr::safety::SystemAdmissionState::Starting);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,7 +143,7 @@ TEST_F(DeviceManagerLifecycleTest,
|
|||||||
{
|
{
|
||||||
cmvr::config::DeviceManagerConfig config;
|
cmvr::config::DeviceManagerConfig config;
|
||||||
config.mutable_safety()->set_mode(
|
config.mutable_safety()->set_mode(
|
||||||
cmvr::config::SafetyCoordinatorConfig::ENFORCE_SELECTED);
|
cmvr::config::SafetyManagerConfig::ENFORCE_SELECTED);
|
||||||
|
|
||||||
auto& manager = cmvr::device::DeviceManager::getInstance(config);
|
auto& manager = cmvr::device::DeviceManager::getInstance(config);
|
||||||
ASSERT_TRUE(manager.initialized());
|
ASSERT_TRUE(manager.initialized());
|
||||||
|
|||||||
@ -1,28 +1,28 @@
|
|||||||
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
||||||
cmake_minimum_required(VERSION 3.22)
|
cmake_minimum_required(VERSION 3.22)
|
||||||
project(cmvr_media_source_hub LANGUAGES CXX)
|
project(cmvr_media_source_manager LANGUAGES CXX)
|
||||||
enable_testing()
|
enable_testing()
|
||||||
add_subdirectory(
|
add_subdirectory(
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../service/stop_all
|
${CMAKE_CURRENT_SOURCE_DIR}/../../service/grpc/stop_all
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/stop_all
|
${CMAKE_CURRENT_BINARY_DIR}/stop_all
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_library(media_source_hub STATIC
|
add_library(media_source_manager STATIC
|
||||||
src/media_source_hub.cpp
|
src/media_source_manager.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
target_compile_features(media_source_hub PUBLIC cxx_std_17)
|
target_compile_features(media_source_manager PUBLIC cxx_std_17)
|
||||||
target_include_directories(media_source_hub
|
target_include_directories(media_source_manager
|
||||||
PUBLIC
|
PUBLIC
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../..
|
${CMAKE_CURRENT_SOURCE_DIR}/../..
|
||||||
)
|
)
|
||||||
target_link_libraries(media_source_hub
|
target_link_libraries(media_source_manager
|
||||||
PUBLIC
|
PUBLIC
|
||||||
cmvr_es::stop_all_admission_gate
|
cmvr_es::stop_all_admission_gate
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(cmvr_es::media_source_hub ALIAS media_source_hub)
|
add_library(cmvr_es::media_source_manager ALIAS media_source_manager)
|
||||||
|
|
||||||
if(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
if(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
||||||
add_library(device_media_source_adapter STATIC
|
add_library(device_media_source_adapter STATIC
|
||||||
@ -35,11 +35,11 @@ if(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
|||||||
)
|
)
|
||||||
target_link_libraries(device_media_source_adapter
|
target_link_libraries(device_media_source_adapter
|
||||||
PUBLIC
|
PUBLIC
|
||||||
cmvr_es::media_source_hub
|
cmvr_es::media_source_manager
|
||||||
cmvr_es::common
|
cmvr_es::common
|
||||||
cmvr_es::proto
|
cmvr_es::proto
|
||||||
cmvr_es::logging
|
cmvr_es::logging
|
||||||
cmvr_es::safety_coordinator
|
cmvr_es::safety_manager
|
||||||
)
|
)
|
||||||
add_library(cmvr_es::device_media_source_adapter ALIAS device_media_source_adapter)
|
add_library(cmvr_es::device_media_source_adapter ALIAS device_media_source_adapter)
|
||||||
|
|
||||||
@ -71,27 +71,27 @@ if(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
option(CMVR_MEDIA_SOURCE_HUB_BUILD_TESTS
|
option(CMVR_MEDIA_SOURCE_MANAGER_BUILD_TESTS
|
||||||
"Build the standalone MediaSourceHub self-test"
|
"Build the standalone MediaSourceManager self-test"
|
||||||
${PROJECT_IS_TOP_LEVEL})
|
${PROJECT_IS_TOP_LEVEL})
|
||||||
|
|
||||||
if(CMVR_MEDIA_SOURCE_HUB_BUILD_TESTS)
|
if(CMVR_MEDIA_SOURCE_MANAGER_BUILD_TESTS)
|
||||||
find_package(Threads REQUIRED)
|
find_package(Threads REQUIRED)
|
||||||
add_executable(media_source_hub_test
|
add_executable(media_source_manager_test
|
||||||
tests/media_source_hub_test.cpp
|
tests/media_source_manager_test.cpp
|
||||||
)
|
)
|
||||||
target_compile_features(media_source_hub_test PRIVATE cxx_std_17)
|
target_compile_features(media_source_manager_test PRIVATE cxx_std_17)
|
||||||
target_link_libraries(media_source_hub_test
|
target_link_libraries(media_source_manager_test
|
||||||
PRIVATE
|
PRIVATE
|
||||||
cmvr_es::media_source_hub
|
cmvr_es::media_source_manager
|
||||||
Threads::Threads
|
Threads::Threads
|
||||||
)
|
)
|
||||||
# This self-test only links the static Hub and pthreads. In the root build,
|
# This self-test only links the static Hub and pthreads. In the root build,
|
||||||
# the project-wide third-party RUNPATH can otherwise make the loader pick up
|
# the project-wide third-party RUNPATH can otherwise make the loader pick up
|
||||||
# a vendor libstdc++.so (for example from the AUBO SDK), even though the test
|
# a vendor libstdc++.so (for example from the AUBO SDK), even though the test
|
||||||
# has no dependency on that SDK.
|
# has no dependency on that SDK.
|
||||||
set_target_properties(media_source_hub_test PROPERTIES
|
set_target_properties(media_source_manager_test PROPERTIES
|
||||||
SKIP_BUILD_RPATH TRUE
|
SKIP_BUILD_RPATH TRUE
|
||||||
)
|
)
|
||||||
add_test(NAME media_source_hub_test COMMAND media_source_hub_test)
|
add_test(NAME media_source_manager_test COMMAND media_source_manager_test)
|
||||||
endif()
|
endif()
|
||||||
@ -9,13 +9,13 @@
|
|||||||
|
|
||||||
#include "devices/camera/abstract_camera.h"
|
#include "devices/camera/abstract_camera.h"
|
||||||
#include "devices/microphone/abstract_microphone.h"
|
#include "devices/microphone/abstract_microphone.h"
|
||||||
#include "manager/media_source_hub/include/media_source_hub.h"
|
#include "manager/media_source_manager/include/media_source_manager.h"
|
||||||
#include "manager/safety/include/safety_coordinator.h"
|
#include "manager/safety_manager/include/safety_manager.h"
|
||||||
|
|
||||||
namespace cmvr::media {
|
namespace cmvr::media {
|
||||||
|
|
||||||
// Process-wide protocol-neutral media hub shared by gRPC and QUIC services.
|
// Process-wide protocol-neutral media hub shared by gRPC and QUIC services.
|
||||||
MediaSourceHub& globalMediaSourceHub();
|
MediaSourceManager& globalMediaSourceManager();
|
||||||
|
|
||||||
std::string cameraColorTrackId(const std::string& device_id);
|
std::string cameraColorTrackId(const std::string& device_id);
|
||||||
std::string microphoneTrackId(const std::string& device_id);
|
std::string microphoneTrackId(const std::string& device_id);
|
||||||
@ -24,7 +24,7 @@ std::string microphoneTrackId(const std::string& device_id);
|
|||||||
// device endpoint's final hardware check. Keep the returned guard alive until
|
// device endpoint's final hardware check. Keep the returned guard alive until
|
||||||
// the operation which can start the physical media producer has returned.
|
// the operation which can start the physical media producer has returned.
|
||||||
safety::DispatchGuard beginMediaSourceStartDispatch(
|
safety::DispatchGuard beginMediaSourceStartDispatch(
|
||||||
safety::SafetyCoordinator& coordinator,
|
safety::SafetyManager& coordinator,
|
||||||
const std::string& device_id);
|
const std::string& device_id);
|
||||||
|
|
||||||
// Registration is idempotent for an already registered track. The adapter owns a
|
// Registration is idempotent for an already registered track. The adapter owns a
|
||||||
@ -32,12 +32,12 @@ safety::DispatchGuard beginMediaSourceStartDispatch(
|
|||||||
// at least one Hub subscription is active. It ensures start() succeeds but deliberately
|
// at least one Hub subscription is active. It ensures start() succeeds but deliberately
|
||||||
// does not call stop(), because the base device lifecycle can also be owned by control RPCs.
|
// does not call stop(), because the base device lifecycle can also be owned by control RPCs.
|
||||||
bool ensureCameraMediaSource(
|
bool ensureCameraMediaSource(
|
||||||
MediaSourceHub& hub,
|
MediaSourceManager& hub,
|
||||||
const std::shared_ptr<device::AbstractCamera>& camera,
|
const std::shared_ptr<device::AbstractCamera>& camera,
|
||||||
size_t ring_capacity = 64);
|
size_t ring_capacity = 64);
|
||||||
|
|
||||||
bool ensureMicrophoneMediaSource(
|
bool ensureMicrophoneMediaSource(
|
||||||
MediaSourceHub& hub,
|
MediaSourceManager& hub,
|
||||||
const std::shared_ptr<device::AbstractMicrophone>& microphone,
|
const std::shared_ptr<device::AbstractMicrophone>& microphone,
|
||||||
size_t ring_capacity = 256);
|
size_t ring_capacity = 256);
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
#ifndef CMVR_ES_MANAGER_MEDIA_SOURCE_HUB_H
|
#ifndef CMVR_ES_MANAGER_MEDIA_SOURCE_MANAGER_H
|
||||||
#define CMVR_ES_MANAGER_MEDIA_SOURCE_HUB_H
|
#define CMVR_ES_MANAGER_MEDIA_SOURCE_MANAGER_H
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
@ -21,15 +21,15 @@ class StopAllAdmissionGate;
|
|||||||
|
|
||||||
namespace cmvr::media {
|
namespace cmvr::media {
|
||||||
|
|
||||||
// MediaSourceHub owns no protocol-specific state. A device or capture adapter registers
|
// MediaSourceManager owns no protocol-specific state. A device or capture adapter registers
|
||||||
// start/stop callbacks and receives a sink callback when the first consumer subscribes.
|
// start/stop callbacks and receives a sink callback when the first consumer subscribes.
|
||||||
class MediaSourceHub final {
|
class MediaSourceManager final {
|
||||||
public:
|
public:
|
||||||
using FrameRing = BroadcastFrameRing<MediaFrame>;
|
using FrameRing = BroadcastFrameRing<MediaFrame>;
|
||||||
using FrameReadResult = FrameRing::ReadResult;
|
using FrameReadResult = FrameRing::ReadResult;
|
||||||
using StartPosition = FrameRing::StartPosition;
|
using StartPosition = FrameRing::StartPosition;
|
||||||
using FrameSink = std::function<void(MediaFramePtr)>;
|
using FrameSink = std::function<void(MediaFramePtr)>;
|
||||||
// Cancellation checks run while MediaSourceHub protects source lifecycle
|
// Cancellation checks run while MediaSourceManager protects source lifecycle
|
||||||
// state. Predicates must therefore be fast, non-blocking and must not call
|
// state. Predicates must therefore be fast, non-blocking and must not call
|
||||||
// back into the same hub.
|
// back into the same hub.
|
||||||
using CancelPredicate = std::function<bool()>;
|
using CancelPredicate = std::function<bool()>;
|
||||||
@ -37,7 +37,7 @@ public:
|
|||||||
struct SourceCallbacks {
|
struct SourceCallbacks {
|
||||||
// start() may run asynchronously. It must observe cancelled during any
|
// start() may run asynchronously. It must observe cancelled during any
|
||||||
// potentially blocking startup work and return false promptly once set.
|
// potentially blocking startup work and return false promptly once set.
|
||||||
// MediaSourceHub retains the callback state until a non-cooperative start
|
// MediaSourceManager retains the callback state until a non-cooperative start
|
||||||
// eventually returns, so late completion cannot access destroyed state.
|
// eventually returns, so late completion cannot access destroyed state.
|
||||||
std::function<bool(
|
std::function<bool(
|
||||||
const FrameSink& sink,
|
const FrameSink& sink,
|
||||||
@ -84,7 +84,7 @@ public:
|
|||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class MediaSourceHub;
|
friend class MediaSourceManager;
|
||||||
Subscription(std::shared_ptr<SourceState> source, FrameRing::Cursor cursor);
|
Subscription(std::shared_ptr<SourceState> source, FrameRing::Cursor cursor);
|
||||||
|
|
||||||
std::shared_ptr<SourceState> source_;
|
std::shared_ptr<SourceState> source_;
|
||||||
@ -94,12 +94,12 @@ public:
|
|||||||
|
|
||||||
// Pass the process-wide StopAll gate for a hub whose sources are part of
|
// Pass the process-wide StopAll gate for a hub whose sources are part of
|
||||||
// whole-machine operational stopping. Test/private hubs may remain local.
|
// whole-machine operational stopping. Test/private hubs may remain local.
|
||||||
explicit MediaSourceHub(
|
explicit MediaSourceManager(
|
||||||
service::StopAllAdmissionGate* admission_gate = nullptr);
|
service::StopAllAdmissionGate* admission_gate = nullptr);
|
||||||
~MediaSourceHub();
|
~MediaSourceManager();
|
||||||
|
|
||||||
MediaSourceHub(const MediaSourceHub&) = delete;
|
MediaSourceManager(const MediaSourceManager&) = delete;
|
||||||
MediaSourceHub& operator=(const MediaSourceHub&) = delete;
|
MediaSourceManager& operator=(const MediaSourceManager&) = delete;
|
||||||
|
|
||||||
bool registerSource(
|
bool registerSource(
|
||||||
TrackDescriptorPtr initial_descriptor,
|
TrackDescriptorPtr initial_descriptor,
|
||||||
@ -159,4 +159,4 @@ private:
|
|||||||
|
|
||||||
} // namespace cmvr::media
|
} // namespace cmvr::media
|
||||||
|
|
||||||
#endif // CMVR_ES_MANAGER_MEDIA_SOURCE_HUB_H
|
#endif // CMVR_ES_MANAGER_MEDIA_SOURCE_MANAGER_H
|
||||||
@ -1,6 +1,6 @@
|
|||||||
#include "manager/media_source_hub/include/device_media_source_adapter.h"
|
#include "manager/media_source_manager/include/device_media_source_adapter.h"
|
||||||
|
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
@ -131,8 +131,8 @@ struct PumpState : public std::enable_shared_from_this<PumpState<DeviceT>> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool begin(
|
bool begin(
|
||||||
const MediaSourceHub::FrameSink& frame_sink,
|
const MediaSourceManager::FrameSink& frame_sink,
|
||||||
const MediaSourceHub::CancelPredicate& cancelled) {
|
const MediaSourceManager::CancelPredicate& cancelled) {
|
||||||
if (!frame_sink || !device) {
|
if (!frame_sink || !device) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -288,7 +288,7 @@ struct PumpState : public std::enable_shared_from_this<PumpState<DeviceT>> {
|
|||||||
std::atomic<bool> running{false};
|
std::atomic<bool> running{false};
|
||||||
std::mutex mutex;
|
std::mutex mutex;
|
||||||
std::thread worker;
|
std::thread worker;
|
||||||
MediaSourceHub::FrameSink sink;
|
MediaSourceManager::FrameSink sink;
|
||||||
bool streaming_started{false};
|
bool streaming_started{false};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -448,7 +448,7 @@ struct CameraPump final : PumpState<device::AbstractCamera> {
|
|||||||
frame.key_frame = source.bKey;
|
frame.key_frame = source.bKey;
|
||||||
frame.discontinuity = pending_discontinuity;
|
frame.discontinuity = pending_discontinuity;
|
||||||
|
|
||||||
MediaSourceHub::FrameSink current_sink;
|
MediaSourceManager::FrameSink current_sink;
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(mutex);
|
std::lock_guard<std::mutex> lock(mutex);
|
||||||
current_sink = sink;
|
current_sink = sink;
|
||||||
@ -581,7 +581,7 @@ struct MicrophonePump final : PumpState<device::AbstractMicrophone> {
|
|||||||
frame.key_frame = true;
|
frame.key_frame = true;
|
||||||
frame.discontinuity = pending_discontinuity;
|
frame.discontinuity = pending_discontinuity;
|
||||||
|
|
||||||
MediaSourceHub::FrameSink current_sink;
|
MediaSourceManager::FrameSink current_sink;
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(mutex);
|
std::lock_guard<std::mutex> lock(mutex);
|
||||||
current_sink = sink;
|
current_sink = sink;
|
||||||
@ -619,8 +619,8 @@ TrackDescriptorPtr initialTrack(
|
|||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
MediaSourceHub& globalMediaSourceHub() {
|
MediaSourceManager& globalMediaSourceManager() {
|
||||||
static MediaSourceHub hub(&service::globalStopAllAdmissionGate());
|
static MediaSourceManager hub(&service::globalStopAllAdmissionGate());
|
||||||
return hub;
|
return hub;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -633,12 +633,12 @@ std::string microphoneTrackId(const std::string& device_id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
safety::DispatchGuard beginMediaSourceStartDispatch(
|
safety::DispatchGuard beginMediaSourceStartDispatch(
|
||||||
safety::SafetyCoordinator& coordinator,
|
safety::SafetyManager& coordinator,
|
||||||
const std::string& device_id)
|
const std::string& device_id)
|
||||||
{
|
{
|
||||||
safety::AdmissionRequest request;
|
safety::AdmissionRequest request;
|
||||||
request.command = {
|
request.command = {
|
||||||
"cmvr.internal.MediaSourceHub/StartSource",
|
"cmvr.internal.MediaSourceManager/StartSource",
|
||||||
safety::CommandIntent::StartActivity,
|
safety::CommandIntent::StartActivity,
|
||||||
safety::SafetyPolicyFamily::Sensor,
|
safety::SafetyPolicyFamily::Sensor,
|
||||||
true,
|
true,
|
||||||
@ -670,7 +670,7 @@ safety::DispatchGuard beginMediaSourceStartDispatch(
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool ensureCameraMediaSource(
|
bool ensureCameraMediaSource(
|
||||||
MediaSourceHub& hub,
|
MediaSourceManager& hub,
|
||||||
const std::shared_ptr<device::AbstractCamera>& camera,
|
const std::shared_ptr<device::AbstractCamera>& camera,
|
||||||
const size_t ring_capacity) {
|
const size_t ring_capacity) {
|
||||||
if (!camera || camera->id().empty()) {
|
if (!camera || camera->id().empty()) {
|
||||||
@ -682,10 +682,10 @@ bool ensureCameraMediaSource(
|
|||||||
}
|
}
|
||||||
|
|
||||||
const auto pump = std::make_shared<CameraPump>(camera, track_id);
|
const auto pump = std::make_shared<CameraPump>(camera, track_id);
|
||||||
MediaSourceHub::SourceCallbacks callbacks;
|
MediaSourceManager::SourceCallbacks callbacks;
|
||||||
callbacks.start = [pump](
|
callbacks.start = [pump](
|
||||||
const MediaSourceHub::FrameSink& sink,
|
const MediaSourceManager::FrameSink& sink,
|
||||||
const MediaSourceHub::CancelPredicate& cancelled) {
|
const MediaSourceManager::CancelPredicate& cancelled) {
|
||||||
return pump->begin(sink, cancelled);
|
return pump->begin(sink, cancelled);
|
||||||
};
|
};
|
||||||
callbacks.stop_confirmed = [pump] { return pump->stop(); };
|
callbacks.stop_confirmed = [pump] { return pump->stop(); };
|
||||||
@ -702,7 +702,7 @@ bool ensureCameraMediaSource(
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool ensureMicrophoneMediaSource(
|
bool ensureMicrophoneMediaSource(
|
||||||
MediaSourceHub& hub,
|
MediaSourceManager& hub,
|
||||||
const std::shared_ptr<device::AbstractMicrophone>& microphone,
|
const std::shared_ptr<device::AbstractMicrophone>& microphone,
|
||||||
const size_t ring_capacity) {
|
const size_t ring_capacity) {
|
||||||
if (!microphone || microphone->id().empty()) {
|
if (!microphone || microphone->id().empty()) {
|
||||||
@ -714,10 +714,10 @@ bool ensureMicrophoneMediaSource(
|
|||||||
}
|
}
|
||||||
|
|
||||||
const auto pump = std::make_shared<MicrophonePump>(microphone, track_id);
|
const auto pump = std::make_shared<MicrophonePump>(microphone, track_id);
|
||||||
MediaSourceHub::SourceCallbacks callbacks;
|
MediaSourceManager::SourceCallbacks callbacks;
|
||||||
callbacks.start = [pump](
|
callbacks.start = [pump](
|
||||||
const MediaSourceHub::FrameSink& sink,
|
const MediaSourceManager::FrameSink& sink,
|
||||||
const MediaSourceHub::CancelPredicate& cancelled) {
|
const MediaSourceManager::CancelPredicate& cancelled) {
|
||||||
return pump->begin(sink, cancelled);
|
return pump->begin(sink, cancelled);
|
||||||
};
|
};
|
||||||
callbacks.stop_confirmed = [pump] { return pump->stop(); };
|
callbacks.stop_confirmed = [pump] { return pump->stop(); };
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "manager/media_source_hub/include/media_source_hub.h"
|
#include "manager/media_source_manager/include/media_source_manager.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
@ -9,11 +9,11 @@
|
|||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
|
|
||||||
namespace cmvr::media {
|
namespace cmvr::media {
|
||||||
|
|
||||||
struct MediaSourceHub::SourceState final : public std::enable_shared_from_this<SourceState> {
|
struct MediaSourceManager::SourceState final : public std::enable_shared_from_this<SourceState> {
|
||||||
enum class Lifecycle {
|
enum class Lifecycle {
|
||||||
STOPPED,
|
STOPPED,
|
||||||
STARTING,
|
STARTING,
|
||||||
@ -406,7 +406,7 @@ struct MediaSourceHub::SourceState final : public std::enable_shared_from_this<S
|
|||||||
std::shared_ptr<StartAttempt> start_attempt;
|
std::shared_ptr<StartAttempt> start_attempt;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct MediaSourceHub::Impl final {
|
struct MediaSourceManager::Impl final {
|
||||||
explicit Impl(service::StopAllAdmissionGate* source_admission_gate)
|
explicit Impl(service::StopAllAdmissionGate* source_admission_gate)
|
||||||
: admission_gate(source_admission_gate) {}
|
: admission_gate(source_admission_gate) {}
|
||||||
|
|
||||||
@ -420,25 +420,25 @@ struct MediaSourceHub::Impl final {
|
|||||||
service::StopAllAdmissionGate* const admission_gate;
|
service::StopAllAdmissionGate* const admission_gate;
|
||||||
};
|
};
|
||||||
|
|
||||||
MediaSourceHub::Subscription::Subscription(
|
MediaSourceManager::Subscription::Subscription(
|
||||||
std::shared_ptr<SourceState> source,
|
std::shared_ptr<SourceState> source,
|
||||||
FrameRing::Cursor cursor)
|
FrameRing::Cursor cursor)
|
||||||
: source_(std::move(source)),
|
: source_(std::move(source)),
|
||||||
cursor_(std::move(cursor)),
|
cursor_(std::move(cursor)),
|
||||||
active_(static_cast<bool>(source_)) {}
|
active_(static_cast<bool>(source_)) {}
|
||||||
|
|
||||||
MediaSourceHub::Subscription::~Subscription() {
|
MediaSourceManager::Subscription::~Subscription() {
|
||||||
reset();
|
reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
MediaSourceHub::Subscription::Subscription(Subscription&& other) noexcept
|
MediaSourceManager::Subscription::Subscription(Subscription&& other) noexcept
|
||||||
: source_(std::move(other.source_)),
|
: source_(std::move(other.source_)),
|
||||||
cursor_(other.cursor_),
|
cursor_(other.cursor_),
|
||||||
active_(other.active_) {
|
active_(other.active_) {
|
||||||
other.active_ = false;
|
other.active_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
MediaSourceHub::Subscription& MediaSourceHub::Subscription::operator=(Subscription&& other) noexcept {
|
MediaSourceManager::Subscription& MediaSourceManager::Subscription::operator=(Subscription&& other) noexcept {
|
||||||
if (this == &other) {
|
if (this == &other) {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@ -450,22 +450,22 @@ MediaSourceHub::Subscription& MediaSourceHub::Subscription::operator=(Subscripti
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MediaSourceHub::Subscription::valid() const {
|
bool MediaSourceManager::Subscription::valid() const {
|
||||||
return active_ && source_ && source_->validForSubscription();
|
return active_ && source_ && source_->validForSubscription();
|
||||||
}
|
}
|
||||||
|
|
||||||
TrackDescriptorPtr MediaSourceHub::Subscription::descriptor() const {
|
TrackDescriptorPtr MediaSourceManager::Subscription::descriptor() const {
|
||||||
return source_ ? source_->currentDescriptor() : nullptr;
|
return source_ ? source_->currentDescriptor() : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<MediaSourceHub::FrameReadResult> MediaSourceHub::Subscription::tryRead() {
|
std::optional<MediaSourceManager::FrameReadResult> MediaSourceManager::Subscription::tryRead() {
|
||||||
if (!active_ || !source_) {
|
if (!active_ || !source_) {
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
return source_->ring.tryRead(cursor_);
|
return source_->ring.tryRead(cursor_);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<MediaSourceHub::FrameReadResult> MediaSourceHub::Subscription::waitRead(
|
std::optional<MediaSourceManager::FrameReadResult> MediaSourceManager::Subscription::waitRead(
|
||||||
const std::chrono::milliseconds timeout) {
|
const std::chrono::milliseconds timeout) {
|
||||||
if (!active_ || !source_) {
|
if (!active_ || !source_) {
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
@ -473,7 +473,7 @@ std::optional<MediaSourceHub::FrameReadResult> MediaSourceHub::Subscription::wai
|
|||||||
return source_->ring.waitRead(cursor_, timeout);
|
return source_->ring.waitRead(cursor_, timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t MediaSourceHub::Subscription::discardPendingIfExceeds(
|
uint64_t MediaSourceManager::Subscription::discardPendingIfExceeds(
|
||||||
const size_t maximum_pending_frames) {
|
const size_t maximum_pending_frames) {
|
||||||
if (!active_ || !source_) {
|
if (!active_ || !source_) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -481,11 +481,11 @@ uint64_t MediaSourceHub::Subscription::discardPendingIfExceeds(
|
|||||||
return source_->ring.discardPendingIfExceeds(cursor_, maximum_pending_frames);
|
return source_->ring.discardPendingIfExceeds(cursor_, maximum_pending_frames);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t MediaSourceHub::Subscription::droppedCount() const noexcept {
|
uint64_t MediaSourceManager::Subscription::droppedCount() const noexcept {
|
||||||
return cursor_.dropped_count;
|
return cursor_.dropped_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MediaSourceHub::Subscription::reset() {
|
void MediaSourceManager::Subscription::reset() {
|
||||||
if (active_ && source_) {
|
if (active_ && source_) {
|
||||||
source_->release();
|
source_->release();
|
||||||
}
|
}
|
||||||
@ -493,15 +493,15 @@ void MediaSourceHub::Subscription::reset() {
|
|||||||
source_.reset();
|
source_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
MediaSourceHub::MediaSourceHub(
|
MediaSourceManager::MediaSourceManager(
|
||||||
service::StopAllAdmissionGate* admission_gate)
|
service::StopAllAdmissionGate* admission_gate)
|
||||||
: impl_(std::make_shared<Impl>(admission_gate)) {}
|
: impl_(std::make_shared<Impl>(admission_gate)) {}
|
||||||
|
|
||||||
MediaSourceHub::~MediaSourceHub() {
|
MediaSourceManager::~MediaSourceManager() {
|
||||||
shutdown();
|
shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MediaSourceHub::registerSource(
|
bool MediaSourceManager::registerSource(
|
||||||
TrackDescriptorPtr initial_descriptor,
|
TrackDescriptorPtr initial_descriptor,
|
||||||
SourceCallbacks callbacks,
|
SourceCallbacks callbacks,
|
||||||
const size_t ring_capacity) {
|
const size_t ring_capacity) {
|
||||||
@ -556,7 +556,7 @@ bool MediaSourceHub::registerSource(
|
|||||||
return inserted;
|
return inserted;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MediaSourceHub::unregisterSource(const std::string& track_id) {
|
bool MediaSourceManager::unregisterSource(const std::string& track_id) {
|
||||||
if (!impl_ || track_id.empty()) {
|
if (!impl_ || track_id.empty()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -590,7 +590,7 @@ bool MediaSourceHub::unregisterSource(const std::string& track_id) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MediaSourceHub::hasSource(const std::string& track_id) const {
|
bool MediaSourceManager::hasSource(const std::string& track_id) const {
|
||||||
if (!impl_) {
|
if (!impl_) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -598,7 +598,7 @@ bool MediaSourceHub::hasSource(const std::string& track_id) const {
|
|||||||
return impl_->sources.find(track_id) != impl_->sources.end();
|
return impl_->sources.find(track_id) != impl_->sources.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<TrackDescriptorPtr> MediaSourceHub::listTracks() const {
|
std::vector<TrackDescriptorPtr> MediaSourceManager::listTracks() const {
|
||||||
std::vector<std::shared_ptr<SourceState>> sources;
|
std::vector<std::shared_ptr<SourceState>> sources;
|
||||||
if (!impl_) {
|
if (!impl_) {
|
||||||
return {};
|
return {};
|
||||||
@ -625,7 +625,7 @@ std::vector<TrackDescriptorPtr> MediaSourceHub::listTracks() const {
|
|||||||
return descriptors;
|
return descriptors;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> MediaSourceHub::trackedSourceIds() const {
|
std::vector<std::string> MediaSourceManager::trackedSourceIds() const {
|
||||||
if (!impl_) {
|
if (!impl_) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -644,7 +644,7 @@ std::vector<std::string> MediaSourceHub::trackedSourceIds() const {
|
|||||||
return source_ids;
|
return source_ids;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t MediaSourceHub::subscriberCount(const std::string& track_id) const {
|
size_t MediaSourceManager::subscriberCount(const std::string& track_id) const {
|
||||||
if (!impl_) {
|
if (!impl_) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -660,7 +660,7 @@ size_t MediaSourceHub::subscriberCount(const std::string& track_id) const {
|
|||||||
return source->subscriberCount();
|
return source->subscriberCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MediaSourceHub::requestKeyFrame(const std::string& track_id) const {
|
bool MediaSourceManager::requestKeyFrame(const std::string& track_id) const {
|
||||||
if (!impl_) {
|
if (!impl_) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -676,7 +676,7 @@ bool MediaSourceHub::requestKeyFrame(const std::string& track_id) const {
|
|||||||
return source->requestKeyFrame();
|
return source->requestKeyFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
MediaSourceHub::Subscription MediaSourceHub::subscribe(
|
MediaSourceManager::Subscription MediaSourceManager::subscribe(
|
||||||
const std::string& track_id,
|
const std::string& track_id,
|
||||||
const StartPosition start_position,
|
const StartPosition start_position,
|
||||||
CancelPredicate cancelled) {
|
CancelPredicate cancelled) {
|
||||||
@ -701,7 +701,7 @@ MediaSourceHub::Subscription MediaSourceHub::subscribe(
|
|||||||
return Subscription(std::move(source), std::move(cursor));
|
return Subscription(std::move(source), std::move(cursor));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MediaSourceHub::stopSourcesForDevice(
|
bool MediaSourceManager::stopSourcesForDevice(
|
||||||
const std::string& source_id,
|
const std::string& source_id,
|
||||||
std::vector<std::string>* failures) {
|
std::vector<std::string>* failures) {
|
||||||
if (source_id.empty()) {
|
if (source_id.empty()) {
|
||||||
@ -713,11 +713,11 @@ bool MediaSourceHub::stopSourcesForDevice(
|
|||||||
return stopSources(source_id, failures);
|
return stopSources(source_id, failures);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MediaSourceHub::stopAllSources(std::vector<std::string>* failures) {
|
bool MediaSourceManager::stopAllSources(std::vector<std::string>* failures) {
|
||||||
return stopSources(std::nullopt, failures);
|
return stopSources(std::nullopt, failures);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MediaSourceHub::stopSources(
|
bool MediaSourceManager::stopSources(
|
||||||
const std::optional<std::string>& source_id,
|
const std::optional<std::string>& source_id,
|
||||||
std::vector<std::string>* failures) {
|
std::vector<std::string>* failures) {
|
||||||
if (failures) {
|
if (failures) {
|
||||||
@ -796,7 +796,7 @@ bool MediaSourceHub::stopSources(
|
|||||||
return quarantined.empty();
|
return quarantined.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MediaSourceHub::shutdown() {
|
void MediaSourceManager::shutdown() {
|
||||||
(void)stopAllSources();
|
(void)stopAllSources();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "manager/media_source_hub/include/device_media_source_adapter.h"
|
#include "manager/media_source_manager/include/device_media_source_adapter.h"
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
#include "manager/safety/include/device_safety_endpoint.h"
|
#include "manager/safety_manager/include/device_safety_endpoint.h"
|
||||||
|
|
||||||
namespace cmvr::media {
|
namespace cmvr::media {
|
||||||
namespace {
|
namespace {
|
||||||
@ -81,9 +81,9 @@ private:
|
|||||||
TEST(DeviceMediaSourceAdapterTest,
|
TEST(DeviceMediaSourceAdapterTest,
|
||||||
SensorStartUsesFinalCheckAndQuarantineRejectsRestart)
|
SensorStartUsesFinalCheckAndQuarantineRejectsRestart)
|
||||||
{
|
{
|
||||||
safety::SafetyCoordinatorConfig config;
|
safety::SafetyManagerConfig config;
|
||||||
config.enforcement_mode = safety::EnforcementMode::EnforceAll;
|
config.enforcement_mode = safety::EnforcementMode::EnforceAll;
|
||||||
safety::SafetyCoordinator coordinator(config);
|
safety::SafetyManager coordinator(config);
|
||||||
auto endpoint = std::make_shared<FakeSensorEndpoint>("camera");
|
auto endpoint = std::make_shared<FakeSensorEndpoint>("camera");
|
||||||
ASSERT_TRUE(coordinator.registerDevice(
|
ASSERT_TRUE(coordinator.registerDevice(
|
||||||
{endpoint->descriptor(), endpoint, {}}));
|
{endpoint->descriptor(), endpoint, {}}));
|
||||||
@ -1,5 +1,5 @@
|
|||||||
#include "manager/media_source_hub/include/media_source_hub.h"
|
#include "manager/media_source_manager/include/media_source_manager.h"
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@ -20,7 +20,7 @@ using cmvr::media::Codec;
|
|||||||
using cmvr::media::MediaFrame;
|
using cmvr::media::MediaFrame;
|
||||||
using cmvr::media::MediaFramePtr;
|
using cmvr::media::MediaFramePtr;
|
||||||
using cmvr::media::MediaKind;
|
using cmvr::media::MediaKind;
|
||||||
using cmvr::media::MediaSourceHub;
|
using cmvr::media::MediaSourceManager;
|
||||||
using cmvr::media::PayloadFormat;
|
using cmvr::media::PayloadFormat;
|
||||||
using cmvr::media::Rational;
|
using cmvr::media::Rational;
|
||||||
using cmvr::media::TrackDescriptor;
|
using cmvr::media::TrackDescriptor;
|
||||||
@ -349,17 +349,17 @@ void testBroadcastConcurrency() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void testHubLifecycleAndDescriptorRefresh() {
|
void testHubLifecycleAndDescriptorRefresh() {
|
||||||
MediaSourceHub hub;
|
MediaSourceManager hub;
|
||||||
const auto initial_descriptor = makeVideoDescriptor(Codec::UNKNOWN, 1);
|
const auto initial_descriptor = makeVideoDescriptor(Codec::UNKNOWN, 1);
|
||||||
std::atomic<int> start_count{0};
|
std::atomic<int> start_count{0};
|
||||||
std::atomic<int> stop_count{0};
|
std::atomic<int> stop_count{0};
|
||||||
std::atomic<int> key_frame_requests{0};
|
std::atomic<int> key_frame_requests{0};
|
||||||
std::mutex sink_mutex;
|
std::mutex sink_mutex;
|
||||||
MediaSourceHub::FrameSink sink;
|
MediaSourceManager::FrameSink sink;
|
||||||
|
|
||||||
MediaSourceHub::SourceCallbacks callbacks;
|
MediaSourceManager::SourceCallbacks callbacks;
|
||||||
callbacks.start = [&](const MediaSourceHub::FrameSink& callback_sink,
|
callbacks.start = [&](const MediaSourceManager::FrameSink& callback_sink,
|
||||||
const MediaSourceHub::CancelPredicate&) {
|
const MediaSourceManager::CancelPredicate&) {
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(sink_mutex);
|
std::lock_guard<std::mutex> lock(sink_mutex);
|
||||||
sink = callback_sink;
|
sink = callback_sink;
|
||||||
@ -394,7 +394,7 @@ void testHubLifecycleAndDescriptorRefresh() {
|
|||||||
|
|
||||||
// Content changes at the same generation must atomically replace the initial descriptor.
|
// Content changes at the same generation must atomically replace the initial descriptor.
|
||||||
const auto actual_descriptor = makeVideoDescriptor(Codec::H264, 1, {0, 0, 0, 1, 0x67});
|
const auto actual_descriptor = makeVideoDescriptor(Codec::H264, 1, {0, 0, 0, 1, 0x67});
|
||||||
MediaSourceHub::FrameSink producer;
|
MediaSourceManager::FrameSink producer;
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(sink_mutex);
|
std::lock_guard<std::mutex> lock(sink_mutex);
|
||||||
producer = sink;
|
producer = sink;
|
||||||
@ -429,14 +429,14 @@ void testHubLifecycleAndDescriptorRefresh() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void testSubscriptionDiscardPending() {
|
void testSubscriptionDiscardPending() {
|
||||||
MediaSourceHub hub;
|
MediaSourceManager hub;
|
||||||
const auto descriptor = makeVideoDescriptor(Codec::H264, 1);
|
const auto descriptor = makeVideoDescriptor(Codec::H264, 1);
|
||||||
std::mutex sink_mutex;
|
std::mutex sink_mutex;
|
||||||
MediaSourceHub::FrameSink sink;
|
MediaSourceManager::FrameSink sink;
|
||||||
|
|
||||||
MediaSourceHub::SourceCallbacks callbacks;
|
MediaSourceManager::SourceCallbacks callbacks;
|
||||||
callbacks.start = [&](const MediaSourceHub::FrameSink& callback_sink,
|
callbacks.start = [&](const MediaSourceManager::FrameSink& callback_sink,
|
||||||
const MediaSourceHub::CancelPredicate&) {
|
const MediaSourceManager::CancelPredicate&) {
|
||||||
std::lock_guard<std::mutex> lock(sink_mutex);
|
std::lock_guard<std::mutex> lock(sink_mutex);
|
||||||
sink = callback_sink;
|
sink = callback_sink;
|
||||||
return true;
|
return true;
|
||||||
@ -450,7 +450,7 @@ void testSubscriptionDiscardPending() {
|
|||||||
auto subscription = hub.subscribe(descriptor->id);
|
auto subscription = hub.subscribe(descriptor->id);
|
||||||
CHECK_TRUE(subscription.valid());
|
CHECK_TRUE(subscription.valid());
|
||||||
|
|
||||||
MediaSourceHub::FrameSink producer;
|
MediaSourceManager::FrameSink producer;
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(sink_mutex);
|
std::lock_guard<std::mutex> lock(sink_mutex);
|
||||||
producer = sink;
|
producer = sink;
|
||||||
@ -471,13 +471,13 @@ void testSubscriptionDiscardPending() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void testHubFailedStartAndShutdown() {
|
void testHubFailedStartAndShutdown() {
|
||||||
MediaSourceHub hub;
|
MediaSourceManager hub;
|
||||||
const auto descriptor = makeVideoDescriptor(Codec::UNKNOWN, 1);
|
const auto descriptor = makeVideoDescriptor(Codec::UNKNOWN, 1);
|
||||||
std::atomic<int> start_attempts{0};
|
std::atomic<int> start_attempts{0};
|
||||||
std::atomic<int> retry_stop_count{0};
|
std::atomic<int> retry_stop_count{0};
|
||||||
MediaSourceHub::SourceCallbacks failed_callbacks;
|
MediaSourceManager::SourceCallbacks failed_callbacks;
|
||||||
failed_callbacks.start = [&](const MediaSourceHub::FrameSink&,
|
failed_callbacks.start = [&](const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) {
|
const MediaSourceManager::CancelPredicate&) {
|
||||||
return ++start_attempts >= 2;
|
return ++start_attempts >= 2;
|
||||||
};
|
};
|
||||||
failed_callbacks.stop = [&] { ++retry_stop_count; };
|
failed_callbacks.stop = [&] { ++retry_stop_count; };
|
||||||
@ -492,9 +492,9 @@ void testHubFailedStartAndShutdown() {
|
|||||||
CHECK_TRUE(hub.unregisterSource(descriptor->id));
|
CHECK_TRUE(hub.unregisterSource(descriptor->id));
|
||||||
|
|
||||||
std::atomic<int> stop_count{0};
|
std::atomic<int> stop_count{0};
|
||||||
MediaSourceHub::SourceCallbacks callbacks;
|
MediaSourceManager::SourceCallbacks callbacks;
|
||||||
callbacks.start = [](const MediaSourceHub::FrameSink&,
|
callbacks.start = [](const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) {
|
const MediaSourceManager::CancelPredicate&) {
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
callbacks.stop = [&] { ++stop_count; };
|
callbacks.stop = [&] { ++stop_count; };
|
||||||
@ -508,13 +508,13 @@ void testHubFailedStartAndShutdown() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void testHubStopAllSourcesAllowsReregistration() {
|
void testHubStopAllSourcesAllowsReregistration() {
|
||||||
MediaSourceHub hub;
|
MediaSourceManager hub;
|
||||||
const auto first_descriptor = makeVideoDescriptor(Codec::H264, 1);
|
const auto first_descriptor = makeVideoDescriptor(Codec::H264, 1);
|
||||||
std::atomic<int> first_stop_count{0};
|
std::atomic<int> first_stop_count{0};
|
||||||
|
|
||||||
MediaSourceHub::SourceCallbacks first_callbacks;
|
MediaSourceManager::SourceCallbacks first_callbacks;
|
||||||
first_callbacks.start = [](const MediaSourceHub::FrameSink&,
|
first_callbacks.start = [](const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) {
|
const MediaSourceManager::CancelPredicate&) {
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
first_callbacks.stop = [&] { ++first_stop_count; };
|
first_callbacks.stop = [&] { ++first_stop_count; };
|
||||||
@ -538,9 +538,9 @@ void testHubStopAllSourcesAllowsReregistration() {
|
|||||||
const auto second_descriptor = makeVideoDescriptor(Codec::H264, 2);
|
const auto second_descriptor = makeVideoDescriptor(Codec::H264, 2);
|
||||||
std::atomic<int> second_start_count{0};
|
std::atomic<int> second_start_count{0};
|
||||||
std::atomic<int> second_stop_count{0};
|
std::atomic<int> second_stop_count{0};
|
||||||
MediaSourceHub::SourceCallbacks second_callbacks;
|
MediaSourceManager::SourceCallbacks second_callbacks;
|
||||||
second_callbacks.start = [&](const MediaSourceHub::FrameSink&,
|
second_callbacks.start = [&](const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) {
|
const MediaSourceManager::CancelPredicate&) {
|
||||||
++second_start_count;
|
++second_start_count;
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
@ -559,13 +559,13 @@ void testHubStopAllSourcesAllowsReregistration() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void testStopAllSourcesReportsAndRetriesUnconfirmedStop() {
|
void testStopAllSourcesReportsAndRetriesUnconfirmedStop() {
|
||||||
MediaSourceHub hub;
|
MediaSourceManager hub;
|
||||||
const auto descriptor = makeVideoDescriptor(Codec::H264, 1);
|
const auto descriptor = makeVideoDescriptor(Codec::H264, 1);
|
||||||
std::atomic<int> stop_attempts{0};
|
std::atomic<int> stop_attempts{0};
|
||||||
|
|
||||||
MediaSourceHub::SourceCallbacks callbacks;
|
MediaSourceManager::SourceCallbacks callbacks;
|
||||||
callbacks.start = [](const MediaSourceHub::FrameSink&,
|
callbacks.start = [](const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) {
|
const MediaSourceManager::CancelPredicate&) {
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
callbacks.stop_confirmed = [&] {
|
callbacks.stop_confirmed = [&] {
|
||||||
@ -590,7 +590,7 @@ void testStopAllSourcesReportsAndRetriesUnconfirmedStop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void testStopSourcesForDeviceIsSelectiveAndRetriesFailures() {
|
void testStopSourcesForDeviceIsSelectiveAndRetriesFailures() {
|
||||||
MediaSourceHub hub;
|
MediaSourceManager hub;
|
||||||
const auto front_video = makeVideoDescriptor(
|
const auto front_video = makeVideoDescriptor(
|
||||||
Codec::H264, 1, {}, "front.video", "camera.front");
|
Codec::H264, 1, {}, "front.video", "camera.front");
|
||||||
const auto front_depth = makeVideoDescriptor(
|
const auto front_depth = makeVideoDescriptor(
|
||||||
@ -604,10 +604,10 @@ void testStopSourcesForDeviceIsSelectiveAndRetriesFailures() {
|
|||||||
auto register_source = [&](
|
auto register_source = [&](
|
||||||
const TrackDescriptorPtr& descriptor,
|
const TrackDescriptorPtr& descriptor,
|
||||||
std::function<bool()> stop_confirmed) {
|
std::function<bool()> stop_confirmed) {
|
||||||
MediaSourceHub::SourceCallbacks callbacks;
|
MediaSourceManager::SourceCallbacks callbacks;
|
||||||
callbacks.start = [](
|
callbacks.start = [](
|
||||||
const MediaSourceHub::FrameSink&,
|
const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) { return true; };
|
const MediaSourceManager::CancelPredicate&) { return true; };
|
||||||
callbacks.stop_confirmed = std::move(stop_confirmed);
|
callbacks.stop_confirmed = std::move(stop_confirmed);
|
||||||
return hub.registerSource(descriptor, std::move(callbacks), 2);
|
return hub.registerSource(descriptor, std::move(callbacks), 2);
|
||||||
};
|
};
|
||||||
@ -665,7 +665,7 @@ void testStopSourcesForDeviceIsSelectiveAndRetriesFailures() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void testDeviceStopsRunConcurrentlyAndSerializeMatchingRegistration() {
|
void testDeviceStopsRunConcurrentlyAndSerializeMatchingRegistration() {
|
||||||
MediaSourceHub hub;
|
MediaSourceManager hub;
|
||||||
const auto first = makeVideoDescriptor(
|
const auto first = makeVideoDescriptor(
|
||||||
Codec::H264, 1, {}, "first.video", "camera.first");
|
Codec::H264, 1, {}, "first.video", "camera.first");
|
||||||
const auto second = makeVideoDescriptor(
|
const auto second = makeVideoDescriptor(
|
||||||
@ -677,10 +677,10 @@ void testDeviceStopsRunConcurrentlyAndSerializeMatchingRegistration() {
|
|||||||
auto register_blocking_source = [&](
|
auto register_blocking_source = [&](
|
||||||
const TrackDescriptorPtr& descriptor,
|
const TrackDescriptorPtr& descriptor,
|
||||||
std::atomic<bool>& entered) {
|
std::atomic<bool>& entered) {
|
||||||
MediaSourceHub::SourceCallbacks callbacks;
|
MediaSourceManager::SourceCallbacks callbacks;
|
||||||
callbacks.start = [](
|
callbacks.start = [](
|
||||||
const MediaSourceHub::FrameSink&,
|
const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) { return true; };
|
const MediaSourceManager::CancelPredicate&) { return true; };
|
||||||
callbacks.stop = [&entered, &release_stops] {
|
callbacks.stop = [&entered, &release_stops] {
|
||||||
entered.store(true, std::memory_order_release);
|
entered.store(true, std::memory_order_release);
|
||||||
while (!release_stops.load(std::memory_order_acquire)) {
|
while (!release_stops.load(std::memory_order_acquire)) {
|
||||||
@ -720,10 +720,10 @@ void testDeviceStopsRunConcurrentlyAndSerializeMatchingRegistration() {
|
|||||||
}
|
}
|
||||||
CHECK_TRUE(second_stop_entered.load(std::memory_order_acquire));
|
CHECK_TRUE(second_stop_entered.load(std::memory_order_acquire));
|
||||||
|
|
||||||
MediaSourceHub::SourceCallbacks replacement_callbacks;
|
MediaSourceManager::SourceCallbacks replacement_callbacks;
|
||||||
replacement_callbacks.start = [](
|
replacement_callbacks.start = [](
|
||||||
const MediaSourceHub::FrameSink&,
|
const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) { return true; };
|
const MediaSourceManager::CancelPredicate&) { return true; };
|
||||||
replacement_callbacks.stop = [] {};
|
replacement_callbacks.stop = [] {};
|
||||||
auto matching_registration = std::async(std::launch::async, [&] {
|
auto matching_registration = std::async(std::launch::async, [&] {
|
||||||
return hub.registerSource(
|
return hub.registerSource(
|
||||||
@ -760,7 +760,7 @@ void testDeviceStopsRunConcurrentlyAndSerializeMatchingRegistration() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void testStopAllWaitsForDeviceStopAndRetainsItsConcurrentRegistrationRule() {
|
void testStopAllWaitsForDeviceStopAndRetainsItsConcurrentRegistrationRule() {
|
||||||
MediaSourceHub hub;
|
MediaSourceManager hub;
|
||||||
const auto first = makeVideoDescriptor(
|
const auto first = makeVideoDescriptor(
|
||||||
Codec::H264, 1, {}, "first.video", "camera.first");
|
Codec::H264, 1, {}, "first.video", "camera.first");
|
||||||
const auto other = makeVideoDescriptor(
|
const auto other = makeVideoDescriptor(
|
||||||
@ -769,10 +769,10 @@ void testStopAllWaitsForDeviceStopAndRetainsItsConcurrentRegistrationRule() {
|
|||||||
std::atomic<bool> release_first_stop{false};
|
std::atomic<bool> release_first_stop{false};
|
||||||
std::atomic<int> other_stops{0};
|
std::atomic<int> other_stops{0};
|
||||||
|
|
||||||
MediaSourceHub::SourceCallbacks first_callbacks;
|
MediaSourceManager::SourceCallbacks first_callbacks;
|
||||||
first_callbacks.start = [](
|
first_callbacks.start = [](
|
||||||
const MediaSourceHub::FrameSink&,
|
const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) { return true; };
|
const MediaSourceManager::CancelPredicate&) { return true; };
|
||||||
first_callbacks.stop = [&] {
|
first_callbacks.stop = [&] {
|
||||||
first_stop_entered.store(true, std::memory_order_release);
|
first_stop_entered.store(true, std::memory_order_release);
|
||||||
while (!release_first_stop.load(std::memory_order_acquire)) {
|
while (!release_first_stop.load(std::memory_order_acquire)) {
|
||||||
@ -798,10 +798,10 @@ void testStopAllWaitsForDeviceStopAndRetainsItsConcurrentRegistrationRule() {
|
|||||||
});
|
});
|
||||||
CHECK_TRUE(stop_all.wait_for(20ms) == std::future_status::timeout);
|
CHECK_TRUE(stop_all.wait_for(20ms) == std::future_status::timeout);
|
||||||
|
|
||||||
MediaSourceHub::SourceCallbacks other_callbacks;
|
MediaSourceManager::SourceCallbacks other_callbacks;
|
||||||
other_callbacks.start = [](
|
other_callbacks.start = [](
|
||||||
const MediaSourceHub::FrameSink&,
|
const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) { return true; };
|
const MediaSourceManager::CancelPredicate&) { return true; };
|
||||||
other_callbacks.stop = [&] { ++other_stops; };
|
other_callbacks.stop = [&] { ++other_stops; };
|
||||||
CHECK_TRUE(hub.registerSource(other, std::move(other_callbacks), 2));
|
CHECK_TRUE(hub.registerSource(other, std::move(other_callbacks), 2));
|
||||||
auto other_subscription = hub.subscribe(other->id);
|
auto other_subscription = hub.subscribe(other->id);
|
||||||
@ -824,15 +824,15 @@ void testStopAllWaitsForDeviceStopAndRetainsItsConcurrentRegistrationRule() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void testConcurrentRegistrationWaitsForStopAllSources() {
|
void testConcurrentRegistrationWaitsForStopAllSources() {
|
||||||
MediaSourceHub hub;
|
MediaSourceManager hub;
|
||||||
const auto descriptor = makeVideoDescriptor(Codec::H264, 1);
|
const auto descriptor = makeVideoDescriptor(Codec::H264, 1);
|
||||||
std::atomic<bool> stop_entered{false};
|
std::atomic<bool> stop_entered{false};
|
||||||
std::atomic<bool> release_stop{false};
|
std::atomic<bool> release_stop{false};
|
||||||
std::atomic<int> old_stop_count{0};
|
std::atomic<int> old_stop_count{0};
|
||||||
|
|
||||||
MediaSourceHub::SourceCallbacks old_callbacks;
|
MediaSourceManager::SourceCallbacks old_callbacks;
|
||||||
old_callbacks.start = [](const MediaSourceHub::FrameSink&,
|
old_callbacks.start = [](const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) {
|
const MediaSourceManager::CancelPredicate&) {
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
old_callbacks.stop = [&] {
|
old_callbacks.stop = [&] {
|
||||||
@ -856,9 +856,9 @@ void testConcurrentRegistrationWaitsForStopAllSources() {
|
|||||||
CHECK_TRUE(stop_entered.load(std::memory_order_acquire));
|
CHECK_TRUE(stop_entered.load(std::memory_order_acquire));
|
||||||
|
|
||||||
std::atomic<int> new_start_count{0};
|
std::atomic<int> new_start_count{0};
|
||||||
MediaSourceHub::SourceCallbacks new_callbacks;
|
MediaSourceManager::SourceCallbacks new_callbacks;
|
||||||
new_callbacks.start = [&](const MediaSourceHub::FrameSink&,
|
new_callbacks.start = [&](const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) {
|
const MediaSourceManager::CancelPredicate&) {
|
||||||
++new_start_count;
|
++new_start_count;
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
@ -889,7 +889,7 @@ void testConcurrentRegistrationWaitsForStopAllSources() {
|
|||||||
|
|
||||||
void testSystemStopAllAdmissionFencesRegistrationAndStartup() {
|
void testSystemStopAllAdmissionFencesRegistrationAndStartup() {
|
||||||
cmvr::service::StopAllAdmissionGate admission_gate;
|
cmvr::service::StopAllAdmissionGate admission_gate;
|
||||||
MediaSourceHub hub(&admission_gate);
|
MediaSourceManager hub(&admission_gate);
|
||||||
const auto dormant = makeVideoDescriptor(
|
const auto dormant = makeVideoDescriptor(
|
||||||
Codec::H264, 1, {}, "dormant.video", "camera.dormant");
|
Codec::H264, 1, {}, "dormant.video", "camera.dormant");
|
||||||
const auto new_source = makeVideoDescriptor(
|
const auto new_source = makeVideoDescriptor(
|
||||||
@ -897,10 +897,10 @@ void testSystemStopAllAdmissionFencesRegistrationAndStartup() {
|
|||||||
std::atomic<int> dormant_starts{0};
|
std::atomic<int> dormant_starts{0};
|
||||||
std::atomic<int> new_starts{0};
|
std::atomic<int> new_starts{0};
|
||||||
|
|
||||||
MediaSourceHub::SourceCallbacks dormant_callbacks;
|
MediaSourceManager::SourceCallbacks dormant_callbacks;
|
||||||
dormant_callbacks.start = [&](
|
dormant_callbacks.start = [&](
|
||||||
const MediaSourceHub::FrameSink&,
|
const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) {
|
const MediaSourceManager::CancelPredicate&) {
|
||||||
++dormant_starts;
|
++dormant_starts;
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
@ -911,10 +911,10 @@ void testSystemStopAllAdmissionFencesRegistrationAndStartup() {
|
|||||||
const auto stop_ticket = admission_gate.beginStopAll();
|
const auto stop_ticket = admission_gate.beginStopAll();
|
||||||
CHECK_TRUE(stop_ticket.valid());
|
CHECK_TRUE(stop_ticket.valid());
|
||||||
|
|
||||||
MediaSourceHub::SourceCallbacks rejected_callbacks;
|
MediaSourceManager::SourceCallbacks rejected_callbacks;
|
||||||
rejected_callbacks.start = [&](
|
rejected_callbacks.start = [&](
|
||||||
const MediaSourceHub::FrameSink&,
|
const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) {
|
const MediaSourceManager::CancelPredicate&) {
|
||||||
++new_starts;
|
++new_starts;
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
@ -928,10 +928,10 @@ void testSystemStopAllAdmissionFencesRegistrationAndStartup() {
|
|||||||
|
|
||||||
CHECK_TRUE(admission_gate.finishStopAll(stop_ticket, true));
|
CHECK_TRUE(admission_gate.finishStopAll(stop_ticket, true));
|
||||||
|
|
||||||
MediaSourceHub::SourceCallbacks recovered_callbacks;
|
MediaSourceManager::SourceCallbacks recovered_callbacks;
|
||||||
recovered_callbacks.start = [&](
|
recovered_callbacks.start = [&](
|
||||||
const MediaSourceHub::FrameSink&,
|
const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) {
|
const MediaSourceManager::CancelPredicate&) {
|
||||||
++new_starts;
|
++new_starts;
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
@ -949,7 +949,7 @@ void testSystemStopAllAdmissionFencesRegistrationAndStartup() {
|
|||||||
|
|
||||||
void testSystemStopAllRejectsRegistrationWaitingForLocalStop() {
|
void testSystemStopAllRejectsRegistrationWaitingForLocalStop() {
|
||||||
cmvr::service::StopAllAdmissionGate admission_gate;
|
cmvr::service::StopAllAdmissionGate admission_gate;
|
||||||
MediaSourceHub hub(&admission_gate);
|
MediaSourceManager hub(&admission_gate);
|
||||||
const auto old_source = makeVideoDescriptor(
|
const auto old_source = makeVideoDescriptor(
|
||||||
Codec::H264, 1, {}, "old.video", "camera.shared");
|
Codec::H264, 1, {}, "old.video", "camera.shared");
|
||||||
const auto replacement = makeVideoDescriptor(
|
const auto replacement = makeVideoDescriptor(
|
||||||
@ -957,10 +957,10 @@ void testSystemStopAllRejectsRegistrationWaitingForLocalStop() {
|
|||||||
std::atomic<bool> stop_entered{false};
|
std::atomic<bool> stop_entered{false};
|
||||||
std::atomic<bool> release_stop{false};
|
std::atomic<bool> release_stop{false};
|
||||||
|
|
||||||
MediaSourceHub::SourceCallbacks old_callbacks;
|
MediaSourceManager::SourceCallbacks old_callbacks;
|
||||||
old_callbacks.start = [](
|
old_callbacks.start = [](
|
||||||
const MediaSourceHub::FrameSink&,
|
const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) { return true; };
|
const MediaSourceManager::CancelPredicate&) { return true; };
|
||||||
old_callbacks.stop = [&] {
|
old_callbacks.stop = [&] {
|
||||||
stop_entered.store(true, std::memory_order_release);
|
stop_entered.store(true, std::memory_order_release);
|
||||||
while (!release_stop.load(std::memory_order_acquire)) {
|
while (!release_stop.load(std::memory_order_acquire)) {
|
||||||
@ -983,10 +983,10 @@ void testSystemStopAllRejectsRegistrationWaitingForLocalStop() {
|
|||||||
CHECK_TRUE(stop_entered.load(std::memory_order_acquire));
|
CHECK_TRUE(stop_entered.load(std::memory_order_acquire));
|
||||||
|
|
||||||
auto make_replacement_callbacks = [] {
|
auto make_replacement_callbacks = [] {
|
||||||
MediaSourceHub::SourceCallbacks callbacks;
|
MediaSourceManager::SourceCallbacks callbacks;
|
||||||
callbacks.start = [](
|
callbacks.start = [](
|
||||||
const MediaSourceHub::FrameSink&,
|
const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) { return true; };
|
const MediaSourceManager::CancelPredicate&) { return true; };
|
||||||
callbacks.stop = [] {};
|
callbacks.stop = [] {};
|
||||||
return callbacks;
|
return callbacks;
|
||||||
};
|
};
|
||||||
@ -1021,17 +1021,17 @@ void testSystemStopAllRejectsRegistrationWaitingForLocalStop() {
|
|||||||
|
|
||||||
void testSystemStopAllRejectsSubscriptionWaitingForLocalStop() {
|
void testSystemStopAllRejectsSubscriptionWaitingForLocalStop() {
|
||||||
cmvr::service::StopAllAdmissionGate admission_gate;
|
cmvr::service::StopAllAdmissionGate admission_gate;
|
||||||
MediaSourceHub hub(&admission_gate);
|
MediaSourceManager hub(&admission_gate);
|
||||||
const auto descriptor = makeVideoDescriptor(
|
const auto descriptor = makeVideoDescriptor(
|
||||||
Codec::H264, 1, {}, "waiting.video", "camera.waiting");
|
Codec::H264, 1, {}, "waiting.video", "camera.waiting");
|
||||||
std::atomic<bool> stop_entered{false};
|
std::atomic<bool> stop_entered{false};
|
||||||
std::atomic<bool> release_stop{false};
|
std::atomic<bool> release_stop{false};
|
||||||
std::atomic<int> starts{0};
|
std::atomic<int> starts{0};
|
||||||
|
|
||||||
MediaSourceHub::SourceCallbacks callbacks;
|
MediaSourceManager::SourceCallbacks callbacks;
|
||||||
callbacks.start = [&](
|
callbacks.start = [&](
|
||||||
const MediaSourceHub::FrameSink&,
|
const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) {
|
const MediaSourceManager::CancelPredicate&) {
|
||||||
++starts;
|
++starts;
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
@ -1084,15 +1084,15 @@ void testSystemStopAllRejectsSubscriptionWaitingForLocalStop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void testStopAllSourcesCancelsStartingSourceBeforeReuse() {
|
void testStopAllSourcesCancelsStartingSourceBeforeReuse() {
|
||||||
MediaSourceHub hub;
|
MediaSourceManager hub;
|
||||||
const auto descriptor = makeVideoDescriptor(Codec::UNKNOWN, 1);
|
const auto descriptor = makeVideoDescriptor(Codec::UNKNOWN, 1);
|
||||||
std::atomic<bool> old_start_entered{false};
|
std::atomic<bool> old_start_entered{false};
|
||||||
std::atomic<bool> release_old_start{false};
|
std::atomic<bool> release_old_start{false};
|
||||||
std::atomic<int> old_stop_count{0};
|
std::atomic<int> old_stop_count{0};
|
||||||
|
|
||||||
MediaSourceHub::SourceCallbacks old_callbacks;
|
MediaSourceManager::SourceCallbacks old_callbacks;
|
||||||
old_callbacks.start = [&](const MediaSourceHub::FrameSink&,
|
old_callbacks.start = [&](const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate& cancelled) {
|
const MediaSourceManager::CancelPredicate& cancelled) {
|
||||||
old_start_entered.store(true, std::memory_order_release);
|
old_start_entered.store(true, std::memory_order_release);
|
||||||
while (!release_old_start.load(std::memory_order_acquire)) {
|
while (!release_old_start.load(std::memory_order_acquire)) {
|
||||||
if (cancelled()) {
|
if (cancelled()) {
|
||||||
@ -1134,9 +1134,9 @@ void testStopAllSourcesCancelsStartingSourceBeforeReuse() {
|
|||||||
CHECK_TRUE(hub.stopAllSources());
|
CHECK_TRUE(hub.stopAllSources());
|
||||||
|
|
||||||
std::atomic<int> new_start_count{0};
|
std::atomic<int> new_start_count{0};
|
||||||
MediaSourceHub::SourceCallbacks new_callbacks;
|
MediaSourceManager::SourceCallbacks new_callbacks;
|
||||||
new_callbacks.start = [&](const MediaSourceHub::FrameSink&,
|
new_callbacks.start = [&](const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) {
|
const MediaSourceManager::CancelPredicate&) {
|
||||||
++new_start_count;
|
++new_start_count;
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
@ -1150,15 +1150,15 @@ void testStopAllSourcesCancelsStartingSourceBeforeReuse() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void testKeyFrameRequestIsOrderedBeforeStop() {
|
void testKeyFrameRequestIsOrderedBeforeStop() {
|
||||||
MediaSourceHub hub;
|
MediaSourceManager hub;
|
||||||
const auto descriptor = makeVideoDescriptor(Codec::H264, 1);
|
const auto descriptor = makeVideoDescriptor(Codec::H264, 1);
|
||||||
std::atomic<bool> key_frame_entered{false};
|
std::atomic<bool> key_frame_entered{false};
|
||||||
std::atomic<bool> release_key_frame{false};
|
std::atomic<bool> release_key_frame{false};
|
||||||
std::atomic<int> stop_count{0};
|
std::atomic<int> stop_count{0};
|
||||||
|
|
||||||
MediaSourceHub::SourceCallbacks callbacks;
|
MediaSourceManager::SourceCallbacks callbacks;
|
||||||
callbacks.start = [](const MediaSourceHub::FrameSink&,
|
callbacks.start = [](const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) {
|
const MediaSourceManager::CancelPredicate&) {
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
callbacks.stop = [&] { ++stop_count; };
|
callbacks.stop = [&] { ++stop_count; };
|
||||||
@ -1196,14 +1196,14 @@ void testKeyFrameRequestIsOrderedBeforeStop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void testHubCancelsBlockedStartWithoutBlockingShutdown() {
|
void testHubCancelsBlockedStartWithoutBlockingShutdown() {
|
||||||
MediaSourceHub hub;
|
MediaSourceManager hub;
|
||||||
const auto descriptor = makeVideoDescriptor(Codec::UNKNOWN, 1);
|
const auto descriptor = makeVideoDescriptor(Codec::UNKNOWN, 1);
|
||||||
std::atomic<bool> start_entered{false};
|
std::atomic<bool> start_entered{false};
|
||||||
std::atomic<bool> start_exited{false};
|
std::atomic<bool> start_exited{false};
|
||||||
|
|
||||||
MediaSourceHub::SourceCallbacks callbacks;
|
MediaSourceManager::SourceCallbacks callbacks;
|
||||||
callbacks.start = [&](const MediaSourceHub::FrameSink&,
|
callbacks.start = [&](const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate& cancelled) {
|
const MediaSourceManager::CancelPredicate& cancelled) {
|
||||||
start_entered.store(true, std::memory_order_release);
|
start_entered.store(true, std::memory_order_release);
|
||||||
while (!cancelled()) {
|
while (!cancelled()) {
|
||||||
std::this_thread::sleep_for(2ms);
|
std::this_thread::sleep_for(2ms);
|
||||||
@ -1246,16 +1246,16 @@ void testHubCancelsBlockedStartWithoutBlockingShutdown() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void testHubQuarantinesNonCooperativeStart() {
|
void testHubQuarantinesNonCooperativeStart() {
|
||||||
MediaSourceHub hub;
|
MediaSourceManager hub;
|
||||||
const auto descriptor = makeVideoDescriptor(Codec::UNKNOWN, 1);
|
const auto descriptor = makeVideoDescriptor(Codec::UNKNOWN, 1);
|
||||||
std::atomic<bool> start_entered{false};
|
std::atomic<bool> start_entered{false};
|
||||||
std::atomic<bool> release_start{false};
|
std::atomic<bool> release_start{false};
|
||||||
std::atomic<bool> start_exited{false};
|
std::atomic<bool> start_exited{false};
|
||||||
std::atomic<int> stop_count{0};
|
std::atomic<int> stop_count{0};
|
||||||
|
|
||||||
MediaSourceHub::SourceCallbacks callbacks;
|
MediaSourceManager::SourceCallbacks callbacks;
|
||||||
callbacks.start = [&](const MediaSourceHub::FrameSink&,
|
callbacks.start = [&](const MediaSourceManager::FrameSink&,
|
||||||
const MediaSourceHub::CancelPredicate&) {
|
const MediaSourceManager::CancelPredicate&) {
|
||||||
start_entered.store(true, std::memory_order_release);
|
start_entered.store(true, std::memory_order_release);
|
||||||
while (!release_start.load(std::memory_order_acquire)) {
|
while (!release_start.load(std::memory_order_acquire)) {
|
||||||
std::this_thread::sleep_for(2ms);
|
std::this_thread::sleep_for(2ms);
|
||||||
@ -1330,9 +1330,9 @@ int main() {
|
|||||||
testHubQuarantinesNonCooperativeStart();
|
testHubQuarantinesNonCooperativeStart();
|
||||||
|
|
||||||
if (failures != 0) {
|
if (failures != 0) {
|
||||||
std::cerr << failures << " media_source_hub checks failed\n";
|
std::cerr << failures << " media_source_manager checks failed\n";
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
std::cout << "media_source_hub self-test passed\n";
|
std::cout << "media_source_manager self-test passed\n";
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1,28 +1,28 @@
|
|||||||
add_library(safety_coordinator STATIC
|
add_library(safety_manager STATIC
|
||||||
src/command_ledger.cpp
|
src/command_ledger.cpp
|
||||||
src/safety_coordinator.cpp
|
src/safety_manager.cpp
|
||||||
src/safety_reason.cpp
|
src/safety_reason.cpp
|
||||||
src/safety_snapshot_store.cpp
|
src/safety_snapshot_store.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(safety_coordinator PUBLIC
|
target_include_directories(safety_manager PUBLIC
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(safety_coordinator PUBLIC
|
target_link_libraries(safety_manager PUBLIC
|
||||||
cmvr_es::control_authority
|
cmvr_es::control_authority_manager
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(cmvr_es::safety_coordinator ALIAS safety_coordinator)
|
add_library(cmvr_es::safety_manager ALIAS safety_manager)
|
||||||
install(TARGETS safety_coordinator LIBRARY DESTINATION lib)
|
install(TARGETS safety_manager LIBRARY DESTINATION lib)
|
||||||
|
|
||||||
if(BUILD_TESTING)
|
if(BUILD_TESTING)
|
||||||
add_executable(safety_snapshot_store_test
|
add_executable(safety_snapshot_store_test
|
||||||
tests/safety_snapshot_store_test.cpp
|
tests/safety_snapshot_store_test.cpp
|
||||||
)
|
)
|
||||||
target_link_libraries(safety_snapshot_store_test PRIVATE
|
target_link_libraries(safety_snapshot_store_test PRIVATE
|
||||||
cmvr_es::safety_coordinator
|
cmvr_es::safety_manager
|
||||||
gtest
|
gtest
|
||||||
gtest_main
|
gtest_main
|
||||||
pthread
|
pthread
|
||||||
@ -37,7 +37,7 @@ if(BUILD_TESTING)
|
|||||||
tests/command_ledger_test.cpp
|
tests/command_ledger_test.cpp
|
||||||
)
|
)
|
||||||
target_link_libraries(command_ledger_test PRIVATE
|
target_link_libraries(command_ledger_test PRIVATE
|
||||||
cmvr_es::safety_coordinator
|
cmvr_es::safety_manager
|
||||||
gtest
|
gtest
|
||||||
gtest_main
|
gtest_main
|
||||||
pthread
|
pthread
|
||||||
@ -48,18 +48,18 @@ if(BUILD_TESTING)
|
|||||||
)
|
)
|
||||||
set_tests_properties(command_ledger_test PROPERTIES TIMEOUT 10)
|
set_tests_properties(command_ledger_test PROPERTIES TIMEOUT 10)
|
||||||
|
|
||||||
add_executable(safety_coordinator_test
|
add_executable(safety_manager_test
|
||||||
tests/safety_coordinator_test.cpp
|
tests/safety_manager_test.cpp
|
||||||
)
|
)
|
||||||
target_link_libraries(safety_coordinator_test PRIVATE
|
target_link_libraries(safety_manager_test PRIVATE
|
||||||
cmvr_es::safety_coordinator
|
cmvr_es::safety_manager
|
||||||
gtest
|
gtest
|
||||||
gtest_main
|
gtest_main
|
||||||
pthread
|
pthread
|
||||||
)
|
)
|
||||||
add_test(
|
add_test(
|
||||||
NAME safety_coordinator_test
|
NAME safety_manager_test
|
||||||
COMMAND safety_coordinator_test
|
COMMAND safety_manager_test
|
||||||
)
|
)
|
||||||
set_tests_properties(safety_coordinator_test PROPERTIES TIMEOUT 15)
|
set_tests_properties(safety_manager_test PROPERTIES TIMEOUT 15)
|
||||||
endif()
|
endif()
|
||||||
@ -9,7 +9,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
#include "manager/safety/include/safety_types.h"
|
#include "manager/safety_manager/include/safety_types.h"
|
||||||
|
|
||||||
namespace cmvr::safety {
|
namespace cmvr::safety {
|
||||||
|
|
||||||
@ -3,7 +3,7 @@
|
|||||||
#include <functional>
|
#include <functional>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include "manager/safety/include/safety_types.h"
|
#include "manager/safety_manager/include/safety_types.h"
|
||||||
|
|
||||||
namespace cmvr::safety {
|
namespace cmvr::safety {
|
||||||
|
|
||||||
@ -10,14 +10,14 @@
|
|||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "manager/safety/include/command_ledger.h"
|
#include "manager/safety_manager/include/command_ledger.h"
|
||||||
#include "manager/safety/include/device_safety_endpoint.h"
|
#include "manager/safety_manager/include/device_safety_endpoint.h"
|
||||||
#include "manager/safety/include/safety_participant.h"
|
#include "manager/safety_manager/include/safety_participant.h"
|
||||||
#include "manager/safety/include/safety_snapshot_store.h"
|
#include "manager/safety_manager/include/safety_snapshot_store.h"
|
||||||
|
|
||||||
namespace cmvr::safety {
|
namespace cmvr::safety {
|
||||||
|
|
||||||
struct SafetyCoordinatorConfig {
|
struct SafetyManagerConfig {
|
||||||
EnforcementMode enforcement_mode{EnforcementMode::Shadow};
|
EnforcementMode enforcement_mode{EnforcementMode::Shadow};
|
||||||
std::unordered_set<std::string> enforced_device_ids;
|
std::unordered_set<std::string> enforced_device_ids;
|
||||||
std::chrono::milliseconds stop_all_timeout{15000};
|
std::chrono::milliseconds stop_all_timeout{15000};
|
||||||
@ -72,7 +72,7 @@ struct ParticipantSafetyStateView {
|
|||||||
ParticipantResultView last_release;
|
ParticipantResultView last_release;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SafetyCoordinatorSnapshot {
|
struct SafetyManagerSnapshot {
|
||||||
SystemAdmissionState system_state{SystemAdmissionState::Starting};
|
SystemAdmissionState system_state{SystemAdmissionState::Starting};
|
||||||
std::uint64_t safety_epoch{0};
|
std::uint64_t safety_epoch{0};
|
||||||
std::string service_instance_id;
|
std::string service_instance_id;
|
||||||
@ -135,7 +135,7 @@ struct RecoveryResult {
|
|||||||
std::vector<SafetyTargetResult> targets;
|
std::vector<SafetyTargetResult> targets;
|
||||||
};
|
};
|
||||||
|
|
||||||
class SafetyCoordinator;
|
class SafetyManager;
|
||||||
|
|
||||||
class DispatchGuard final {
|
class DispatchGuard final {
|
||||||
public:
|
public:
|
||||||
@ -153,23 +153,23 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class SafetyCoordinator;
|
friend class SafetyManager;
|
||||||
DispatchGuard(SafetyCoordinator* coordinator,
|
DispatchGuard(SafetyManager* coordinator,
|
||||||
std::string device_id,
|
std::string device_id,
|
||||||
HardwareCheckResult hardware_check) noexcept;
|
HardwareCheckResult hardware_check) noexcept;
|
||||||
void reset_() noexcept;
|
void reset_() noexcept;
|
||||||
|
|
||||||
SafetyCoordinator* coordinator_{nullptr};
|
SafetyManager* coordinator_{nullptr};
|
||||||
std::string device_id_;
|
std::string device_id_;
|
||||||
HardwareCheckResult hardware_check_;
|
HardwareCheckResult hardware_check_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class SafetyCoordinator final {
|
class SafetyManager final {
|
||||||
public:
|
public:
|
||||||
explicit SafetyCoordinator(SafetyCoordinatorConfig config = {});
|
explicit SafetyManager(SafetyManagerConfig config = {});
|
||||||
~SafetyCoordinator();
|
~SafetyManager();
|
||||||
SafetyCoordinator(const SafetyCoordinator&) = delete;
|
SafetyManager(const SafetyManager&) = delete;
|
||||||
SafetyCoordinator& operator=(const SafetyCoordinator&) = delete;
|
SafetyManager& operator=(const SafetyManager&) = delete;
|
||||||
|
|
||||||
bool registerDevice(DeviceSafetyRegistration registration);
|
bool registerDevice(DeviceSafetyRegistration registration);
|
||||||
bool unregisterDevice(const std::string& device_id);
|
bool unregisterDevice(const std::string& device_id);
|
||||||
@ -205,13 +205,13 @@ public:
|
|||||||
SafetyClock::time_point deadline = SafetyClock::time_point::max());
|
SafetyClock::time_point deadline = SafetyClock::time_point::max());
|
||||||
RecoveryResult recover(const RecoveryRequest& request);
|
RecoveryResult recover(const RecoveryRequest& request);
|
||||||
|
|
||||||
SafetyCoordinatorSnapshot snapshot() const;
|
SafetyManagerSnapshot snapshot() const;
|
||||||
SafetySnapshotStore& snapshotStore() noexcept;
|
SafetySnapshotStore& snapshotStore() noexcept;
|
||||||
const SafetySnapshotStore& snapshotStore() const noexcept;
|
const SafetySnapshotStore& snapshotStore() const noexcept;
|
||||||
CommandLedger& commandLedger() noexcept;
|
CommandLedger& commandLedger() noexcept;
|
||||||
const CommandLedger& commandLedger() const noexcept;
|
const CommandLedger& commandLedger() const noexcept;
|
||||||
const std::string& serviceInstanceId() const noexcept;
|
const std::string& serviceInstanceId() const noexcept;
|
||||||
const SafetyCoordinatorConfig& config() const noexcept;
|
const SafetyManagerConfig& config() const noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class DispatchGuard;
|
friend class DispatchGuard;
|
||||||
@ -5,7 +5,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "manager/safety/include/safety_types.h"
|
#include "manager/safety_manager/include/safety_types.h"
|
||||||
|
|
||||||
namespace cmvr::safety {
|
namespace cmvr::safety {
|
||||||
|
|
||||||
@ -7,7 +7,7 @@
|
|||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "manager/safety/include/safety_types.h"
|
#include "manager/safety_manager/include/safety_types.h"
|
||||||
|
|
||||||
namespace cmvr::safety {
|
namespace cmvr::safety {
|
||||||
|
|
||||||
@ -7,7 +7,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "devices/device_types.h"
|
#include "devices/device_types.h"
|
||||||
#include "manager/safety/include/safety_reason.h"
|
#include "manager/safety_manager/include/safety_reason.h"
|
||||||
|
|
||||||
namespace cmvr::safety {
|
namespace cmvr::safety {
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "manager/safety/include/command_ledger.h"
|
#include "manager/safety_manager/include/command_ledger.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "manager/safety/include/safety_coordinator.h"
|
#include "manager/safety_manager/include/safety_manager.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
@ -187,10 +187,10 @@ int phaseRank(const ParticipantPhase phase) noexcept
|
|||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
struct SafetyCoordinator::Impl {
|
struct SafetyManager::Impl {
|
||||||
struct PublisherBinding {
|
struct PublisherBinding {
|
||||||
std::atomic<bool> active{true};
|
std::atomic<bool> active{true};
|
||||||
SafetyCoordinator* coordinator{nullptr};
|
SafetyManager* coordinator{nullptr};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DeviceSlot {
|
struct DeviceSlot {
|
||||||
@ -240,7 +240,7 @@ struct SafetyCoordinator::Impl {
|
|||||||
RecoveryResult result;
|
RecoveryResult result;
|
||||||
};
|
};
|
||||||
|
|
||||||
explicit Impl(SafetyCoordinatorConfig source)
|
explicit Impl(SafetyManagerConfig source)
|
||||||
: config(std::move(source)),
|
: config(std::move(source)),
|
||||||
ledger(config.command_ledger),
|
ledger(config.command_ledger),
|
||||||
service_instance_id(makeInstanceId()),
|
service_instance_id(makeInstanceId()),
|
||||||
@ -249,7 +249,7 @@ struct SafetyCoordinator::Impl {
|
|||||||
if (config.stop_all_timeout <= std::chrono::milliseconds::zero() ||
|
if (config.stop_all_timeout <= std::chrono::milliseconds::zero() ||
|
||||||
config.recovery_timeout <= std::chrono::milliseconds::zero() ||
|
config.recovery_timeout <= std::chrono::milliseconds::zero() ||
|
||||||
config.event_history_capacity == 0) {
|
config.event_history_capacity == 0) {
|
||||||
throw std::invalid_argument("invalid SafetyCoordinatorConfig");
|
throw std::invalid_argument("invalid SafetyManagerConfig");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -339,7 +339,7 @@ struct SafetyCoordinator::Impl {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
SafetyCoordinatorConfig config;
|
SafetyManagerConfig config;
|
||||||
SafetySnapshotStore snapshots;
|
SafetySnapshotStore snapshots;
|
||||||
CommandLedger ledger;
|
CommandLedger ledger;
|
||||||
const std::string service_instance_id;
|
const std::string service_instance_id;
|
||||||
@ -367,7 +367,7 @@ struct SafetyCoordinator::Impl {
|
|||||||
};
|
};
|
||||||
|
|
||||||
DispatchGuard::DispatchGuard(
|
DispatchGuard::DispatchGuard(
|
||||||
SafetyCoordinator* coordinator,
|
SafetyManager* coordinator,
|
||||||
std::string device_id,
|
std::string device_id,
|
||||||
HardwareCheckResult hardware_check) noexcept
|
HardwareCheckResult hardware_check) noexcept
|
||||||
: coordinator_(coordinator),
|
: coordinator_(coordinator),
|
||||||
@ -408,12 +408,12 @@ void DispatchGuard::reset_() noexcept
|
|||||||
coordinator->endDispatch_(device_id_);
|
coordinator->endDispatch_(device_id_);
|
||||||
}
|
}
|
||||||
|
|
||||||
SafetyCoordinator::SafetyCoordinator(SafetyCoordinatorConfig config)
|
SafetyManager::SafetyManager(SafetyManagerConfig config)
|
||||||
: impl_(std::make_unique<Impl>(std::move(config)))
|
: impl_(std::make_unique<Impl>(std::move(config)))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
SafetyCoordinator::~SafetyCoordinator()
|
SafetyManager::~SafetyManager()
|
||||||
{
|
{
|
||||||
beginShutdown();
|
beginShutdown();
|
||||||
std::vector<std::shared_ptr<DeviceSafetyEndpoint>> endpoints;
|
std::vector<std::shared_ptr<DeviceSafetyEndpoint>> endpoints;
|
||||||
@ -436,7 +436,7 @@ SafetyCoordinator::~SafetyCoordinator()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SafetyCoordinator::registerDevice(DeviceSafetyRegistration registration)
|
bool SafetyManager::registerDevice(DeviceSafetyRegistration registration)
|
||||||
{
|
{
|
||||||
if (registration.descriptor.device_id.empty() ||
|
if (registration.descriptor.device_id.empty() ||
|
||||||
registration.descriptor.maximum_snapshot_age <=
|
registration.descriptor.maximum_snapshot_age <=
|
||||||
@ -531,7 +531,7 @@ bool SafetyCoordinator::registerDevice(DeviceSafetyRegistration registration)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SafetyCoordinator::unregisterDevice(const std::string& device_id)
|
bool SafetyManager::unregisterDevice(const std::string& device_id)
|
||||||
{
|
{
|
||||||
std::shared_ptr<DeviceSafetyEndpoint> endpoint;
|
std::shared_ptr<DeviceSafetyEndpoint> endpoint;
|
||||||
std::string participant_id;
|
std::string participant_id;
|
||||||
@ -576,7 +576,7 @@ bool SafetyCoordinator::unregisterDevice(const std::string& device_id)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SafetyCoordinator::registerParticipant(
|
bool SafetyManager::registerParticipant(
|
||||||
std::shared_ptr<SafetyParticipant> participant)
|
std::shared_ptr<SafetyParticipant> participant)
|
||||||
{
|
{
|
||||||
if (!participant) {
|
if (!participant) {
|
||||||
@ -597,7 +597,7 @@ bool SafetyCoordinator::registerParticipant(
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SafetyCoordinator::unregisterParticipant(
|
bool SafetyManager::unregisterParticipant(
|
||||||
const std::string& participant_id)
|
const std::string& participant_id)
|
||||||
{
|
{
|
||||||
std::lock_guard lock(impl_->mutex);
|
std::lock_guard lock(impl_->mutex);
|
||||||
@ -615,7 +615,7 @@ bool SafetyCoordinator::unregisterParticipant(
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SafetyCoordinator::updateDeviceRuntimeState(
|
void SafetyManager::updateDeviceRuntimeState(
|
||||||
const std::string& device_id,
|
const std::string& device_id,
|
||||||
const device::ManagedDeviceState lifecycle,
|
const device::ManagedDeviceState lifecycle,
|
||||||
device::DeviceHealthSnapshot health)
|
device::DeviceHealthSnapshot health)
|
||||||
@ -633,7 +633,7 @@ void SafetyCoordinator::updateDeviceRuntimeState(
|
|||||||
impl_->state_changed.notify_all();
|
impl_->state_changed.notify_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SafetyCoordinator::publishSafetySnapshot(DeviceSafetySnapshot snapshot)
|
bool SafetyManager::publishSafetySnapshot(DeviceSafetySnapshot snapshot)
|
||||||
{
|
{
|
||||||
const std::string device_id = snapshot.device_id;
|
const std::string device_id = snapshot.device_id;
|
||||||
if (!impl_->snapshots.publish(std::move(snapshot))) {
|
if (!impl_->snapshots.publish(std::move(snapshot))) {
|
||||||
@ -679,7 +679,7 @@ bool SafetyCoordinator::publishSafetySnapshot(DeviceSafetySnapshot snapshot)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<std::uint64_t> SafetyCoordinator::advanceDeviceGeneration(
|
std::optional<std::uint64_t> SafetyManager::advanceDeviceGeneration(
|
||||||
const std::string& device_id)
|
const std::string& device_id)
|
||||||
{
|
{
|
||||||
const auto generation = impl_->snapshots.bumpGeneration(device_id);
|
const auto generation = impl_->snapshots.bumpGeneration(device_id);
|
||||||
@ -709,7 +709,7 @@ std::optional<std::uint64_t> SafetyCoordinator::advanceDeviceGeneration(
|
|||||||
return generation;
|
return generation;
|
||||||
}
|
}
|
||||||
|
|
||||||
StartupCoverageResult SafetyCoordinator::validateStartupCoverage(
|
StartupCoverageResult SafetyManager::validateStartupCoverage(
|
||||||
const SafetyClock::time_point deadline)
|
const SafetyClock::time_point deadline)
|
||||||
{
|
{
|
||||||
struct Target {
|
struct Target {
|
||||||
@ -844,7 +844,7 @@ StartupCoverageResult SafetyCoordinator::validateStartupCoverage(
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SafetyCoordinator::markStartupComplete()
|
void SafetyManager::markStartupComplete()
|
||||||
{
|
{
|
||||||
std::lock_guard lock(impl_->mutex);
|
std::lock_guard lock(impl_->mutex);
|
||||||
if (impl_->system_state != SystemAdmissionState::Starting) {
|
if (impl_->system_state != SystemAdmissionState::Starting) {
|
||||||
@ -863,7 +863,7 @@ void SafetyCoordinator::markStartupComplete()
|
|||||||
impl_->state_changed.notify_all();
|
impl_->state_changed.notify_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SafetyCoordinator::beginShutdown() noexcept
|
void SafetyManager::beginShutdown() noexcept
|
||||||
{
|
{
|
||||||
if (!impl_) {
|
if (!impl_) {
|
||||||
return;
|
return;
|
||||||
@ -885,7 +885,7 @@ void SafetyCoordinator::beginShutdown() noexcept
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AdmissionDecision SafetyCoordinator::evaluate(
|
AdmissionDecision SafetyManager::evaluate(
|
||||||
const AdmissionRequest& request) const
|
const AdmissionRequest& request) const
|
||||||
{
|
{
|
||||||
AdmissionDecision decision;
|
AdmissionDecision decision;
|
||||||
@ -1039,7 +1039,7 @@ AdmissionDecision SafetyCoordinator::evaluate(
|
|||||||
return allow();
|
return allow();
|
||||||
}
|
}
|
||||||
|
|
||||||
AdmissionResult SafetyCoordinator::admit(const AdmissionRequest& request)
|
AdmissionResult SafetyManager::admit(const AdmissionRequest& request)
|
||||||
{
|
{
|
||||||
AdmissionResult result;
|
AdmissionResult result;
|
||||||
result.decision = evaluate(request);
|
result.decision = evaluate(request);
|
||||||
@ -1060,7 +1060,7 @@ AdmissionResult SafetyCoordinator::admit(const AdmissionRequest& request)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
HardwareCheckResult SafetyCoordinator::revalidatePermit(
|
HardwareCheckResult SafetyManager::revalidatePermit(
|
||||||
const AdmissionPermit& permit) const
|
const AdmissionPermit& permit) const
|
||||||
{
|
{
|
||||||
const auto rejected = [](const SafetyReason reason, std::string detail) {
|
const auto rejected = [](const SafetyReason reason, std::string detail) {
|
||||||
@ -1114,7 +1114,7 @@ HardwareCheckResult SafetyCoordinator::revalidatePermit(
|
|||||||
return {true, SafetyReason::None, {}};
|
return {true, SafetyReason::None, {}};
|
||||||
}
|
}
|
||||||
|
|
||||||
DispatchGuard SafetyCoordinator::beginDispatch(
|
DispatchGuard SafetyManager::beginDispatch(
|
||||||
const AdmissionPermit& permit)
|
const AdmissionPermit& permit)
|
||||||
{
|
{
|
||||||
const auto rejected = [&permit](
|
const auto rejected = [&permit](
|
||||||
@ -1205,7 +1205,7 @@ DispatchGuard SafetyCoordinator::beginDispatch(
|
|||||||
return DispatchGuard(this, permit.device_id, std::move(hardware_check));
|
return DispatchGuard(this, permit.device_id, std::move(hardware_check));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SafetyCoordinator::endDispatch_(const std::string& device_id) noexcept
|
void SafetyManager::endDispatch_(const std::string& device_id) noexcept
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
std::lock_guard lock(impl_->mutex);
|
std::lock_guard lock(impl_->mutex);
|
||||||
@ -1219,7 +1219,7 @@ void SafetyCoordinator::endDispatch_(const std::string& device_id) noexcept
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SafetyCoordinator::quarantineDevice(
|
void SafetyManager::quarantineDevice(
|
||||||
const std::string& device_id,
|
const std::string& device_id,
|
||||||
const SafetyReason reason,
|
const SafetyReason reason,
|
||||||
std::string operation_id)
|
std::string operation_id)
|
||||||
@ -1245,7 +1245,7 @@ void SafetyCoordinator::quarantineDevice(
|
|||||||
impl_->state_changed.notify_all();
|
impl_->state_changed.notify_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
StopAllResult SafetyCoordinator::stopAll(
|
StopAllResult SafetyManager::stopAll(
|
||||||
std::string operation_id,
|
std::string operation_id,
|
||||||
SafetyClock::time_point deadline)
|
SafetyClock::time_point deadline)
|
||||||
{
|
{
|
||||||
@ -1754,7 +1754,7 @@ StopAllResult SafetyCoordinator::stopAll(
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
RecoveryResult SafetyCoordinator::recover(const RecoveryRequest& request)
|
RecoveryResult SafetyManager::recover(const RecoveryRequest& request)
|
||||||
{
|
{
|
||||||
RecoveryResult invalid;
|
RecoveryResult invalid;
|
||||||
invalid.recovery_id = request.recovery_id;
|
invalid.recovery_id = request.recovery_id;
|
||||||
@ -2323,9 +2323,9 @@ RecoveryResult SafetyCoordinator::recover(const RecoveryRequest& request)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
SafetyCoordinatorSnapshot SafetyCoordinator::snapshot() const
|
SafetyManagerSnapshot SafetyManager::snapshot() const
|
||||||
{
|
{
|
||||||
SafetyCoordinatorSnapshot result;
|
SafetyManagerSnapshot result;
|
||||||
std::lock_guard lock(impl_->mutex);
|
std::lock_guard lock(impl_->mutex);
|
||||||
result.system_state = impl_->system_state;
|
result.system_state = impl_->system_state;
|
||||||
result.safety_epoch = impl_->safety_epoch;
|
result.safety_epoch = impl_->safety_epoch;
|
||||||
@ -2376,32 +2376,32 @@ SafetyCoordinatorSnapshot SafetyCoordinator::snapshot() const
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
SafetySnapshotStore& SafetyCoordinator::snapshotStore() noexcept
|
SafetySnapshotStore& SafetyManager::snapshotStore() noexcept
|
||||||
{
|
{
|
||||||
return impl_->snapshots;
|
return impl_->snapshots;
|
||||||
}
|
}
|
||||||
|
|
||||||
const SafetySnapshotStore& SafetyCoordinator::snapshotStore() const noexcept
|
const SafetySnapshotStore& SafetyManager::snapshotStore() const noexcept
|
||||||
{
|
{
|
||||||
return impl_->snapshots;
|
return impl_->snapshots;
|
||||||
}
|
}
|
||||||
|
|
||||||
CommandLedger& SafetyCoordinator::commandLedger() noexcept
|
CommandLedger& SafetyManager::commandLedger() noexcept
|
||||||
{
|
{
|
||||||
return impl_->ledger;
|
return impl_->ledger;
|
||||||
}
|
}
|
||||||
|
|
||||||
const CommandLedger& SafetyCoordinator::commandLedger() const noexcept
|
const CommandLedger& SafetyManager::commandLedger() const noexcept
|
||||||
{
|
{
|
||||||
return impl_->ledger;
|
return impl_->ledger;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& SafetyCoordinator::serviceInstanceId() const noexcept
|
const std::string& SafetyManager::serviceInstanceId() const noexcept
|
||||||
{
|
{
|
||||||
return impl_->service_instance_id;
|
return impl_->service_instance_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
const SafetyCoordinatorConfig& SafetyCoordinator::config() const noexcept
|
const SafetyManagerConfig& SafetyManager::config() const noexcept
|
||||||
{
|
{
|
||||||
return impl_->config;
|
return impl_->config;
|
||||||
}
|
}
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "manager/safety/include/safety_reason.h"
|
#include "manager/safety_manager/include/safety_reason.h"
|
||||||
|
|
||||||
namespace cmvr::safety {
|
namespace cmvr::safety {
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "manager/safety/include/safety_snapshot_store.h"
|
#include "manager/safety_manager/include/safety_snapshot_store.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "manager/safety/include/command_ledger.h"
|
#include "manager/safety_manager/include/command_ledger.h"
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "manager/safety/include/safety_coordinator.h"
|
#include "manager/safety_manager/include/safety_manager.h"
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@ -166,9 +166,9 @@ AdmissionRequest actuateRequest()
|
|||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(SafetyCoordinatorTest, ShadowReportsDenyWithoutChangingLegacyBehavior)
|
TEST(SafetyManagerTest, ShadowReportsDenyWithoutChangingLegacyBehavior)
|
||||||
{
|
{
|
||||||
SafetyCoordinator coordinator;
|
SafetyManager coordinator;
|
||||||
ASSERT_TRUE(coordinator.registerDevice({controlDescriptor(), {}, {}}));
|
ASSERT_TRUE(coordinator.registerDevice({controlDescriptor(), {}, {}}));
|
||||||
coordinator.markStartupComplete();
|
coordinator.markStartupComplete();
|
||||||
|
|
||||||
@ -180,22 +180,22 @@ TEST(SafetyCoordinatorTest, ShadowReportsDenyWithoutChangingLegacyBehavior)
|
|||||||
EXPECT_TRUE(result.permit.has_value());
|
EXPECT_TRUE(result.permit.has_value());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(SafetyCoordinatorTest,
|
TEST(SafetyManagerTest,
|
||||||
EnforceSelectedStartupRejectsEmptyOrUnknownCoverage)
|
EnforceSelectedStartupRejectsEmptyOrUnknownCoverage)
|
||||||
{
|
{
|
||||||
SafetyCoordinatorConfig empty_config;
|
SafetyManagerConfig empty_config;
|
||||||
empty_config.enforcement_mode = EnforcementMode::EnforceSelected;
|
empty_config.enforcement_mode = EnforcementMode::EnforceSelected;
|
||||||
SafetyCoordinator empty(empty_config);
|
SafetyManager empty(empty_config);
|
||||||
const auto empty_result = empty.validateStartupCoverage(
|
const auto empty_result = empty.validateStartupCoverage(
|
||||||
SafetyClock::now() + std::chrono::milliseconds(10));
|
SafetyClock::now() + std::chrono::milliseconds(10));
|
||||||
ASSERT_FALSE(empty_result.ready);
|
ASSERT_FALSE(empty_result.ready);
|
||||||
ASSERT_EQ(empty_result.issues.size(), 1U);
|
ASSERT_EQ(empty_result.issues.size(), 1U);
|
||||||
EXPECT_EQ(empty_result.issues.front().reason, SafetyReason::InvalidArgument);
|
EXPECT_EQ(empty_result.issues.front().reason, SafetyReason::InvalidArgument);
|
||||||
|
|
||||||
SafetyCoordinatorConfig missing_config;
|
SafetyManagerConfig missing_config;
|
||||||
missing_config.enforcement_mode = EnforcementMode::EnforceSelected;
|
missing_config.enforcement_mode = EnforcementMode::EnforceSelected;
|
||||||
missing_config.enforced_device_ids.insert("missing-arm");
|
missing_config.enforced_device_ids.insert("missing-arm");
|
||||||
SafetyCoordinator missing(missing_config);
|
SafetyManager missing(missing_config);
|
||||||
const auto missing_result = missing.validateStartupCoverage(
|
const auto missing_result = missing.validateStartupCoverage(
|
||||||
SafetyClock::now() + std::chrono::milliseconds(10));
|
SafetyClock::now() + std::chrono::milliseconds(10));
|
||||||
ASSERT_FALSE(missing_result.ready);
|
ASSERT_FALSE(missing_result.ready);
|
||||||
@ -204,13 +204,13 @@ TEST(SafetyCoordinatorTest,
|
|||||||
EXPECT_EQ(missing_result.issues.front().reason, SafetyReason::DeviceNotFound);
|
EXPECT_EQ(missing_result.issues.front().reason, SafetyReason::DeviceNotFound);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(SafetyCoordinatorTest,
|
TEST(SafetyManagerTest,
|
||||||
EnforceAllStartupRequiresEndpointParticipantAndFreshSnapshot)
|
EnforceAllStartupRequiresEndpointParticipantAndFreshSnapshot)
|
||||||
{
|
{
|
||||||
SafetyCoordinatorConfig config;
|
SafetyManagerConfig config;
|
||||||
config.enforcement_mode = EnforcementMode::EnforceAll;
|
config.enforcement_mode = EnforcementMode::EnforceAll;
|
||||||
|
|
||||||
SafetyCoordinator missing_capability(config);
|
SafetyManager missing_capability(config);
|
||||||
ASSERT_TRUE(missing_capability.registerDevice(
|
ASSERT_TRUE(missing_capability.registerDevice(
|
||||||
{controlDescriptor(), {}, {}}));
|
{controlDescriptor(), {}, {}}));
|
||||||
const auto structural = missing_capability.validateStartupCoverage(
|
const auto structural = missing_capability.validateStartupCoverage(
|
||||||
@ -218,7 +218,7 @@ TEST(SafetyCoordinatorTest,
|
|||||||
EXPECT_FALSE(structural.ready);
|
EXPECT_FALSE(structural.ready);
|
||||||
EXPECT_EQ(structural.issues.size(), 2U);
|
EXPECT_EQ(structural.issues.size(), 2U);
|
||||||
|
|
||||||
SafetyCoordinator missing_sample(config);
|
SafetyManager missing_sample(config);
|
||||||
auto silent_endpoint =
|
auto silent_endpoint =
|
||||||
std::make_shared<FakeEndpoint>(controlDescriptor());
|
std::make_shared<FakeEndpoint>(controlDescriptor());
|
||||||
silent_endpoint->publish_on_refresh = false;
|
silent_endpoint->publish_on_refresh = false;
|
||||||
@ -233,12 +233,12 @@ TEST(SafetyCoordinatorTest,
|
|||||||
EXPECT_EQ(stale.issues.front().reason, SafetyReason::SafetyStateMissing);
|
EXPECT_EQ(stale.issues.front().reason, SafetyReason::SafetyStateMissing);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(SafetyCoordinatorTest,
|
TEST(SafetyManagerTest,
|
||||||
HardwareUnsafeSnapshotBlocksAdmissionButNotStructuralStartup)
|
HardwareUnsafeSnapshotBlocksAdmissionButNotStructuralStartup)
|
||||||
{
|
{
|
||||||
SafetyCoordinatorConfig config;
|
SafetyManagerConfig config;
|
||||||
config.enforcement_mode = EnforcementMode::EnforceAll;
|
config.enforcement_mode = EnforcementMode::EnforceAll;
|
||||||
SafetyCoordinator coordinator(config);
|
SafetyManager coordinator(config);
|
||||||
auto endpoint = std::make_shared<FakeEndpoint>(controlDescriptor());
|
auto endpoint = std::make_shared<FakeEndpoint>(controlDescriptor());
|
||||||
endpoint->condition = SafetyCondition::Unsafe;
|
endpoint->condition = SafetyCondition::Unsafe;
|
||||||
endpoint->emergency_stop = TriState::True;
|
endpoint->emergency_stop = TriState::True;
|
||||||
@ -258,11 +258,11 @@ TEST(SafetyCoordinatorTest,
|
|||||||
admission.decision.reason, SafetyReason::EmergencyStopActive);
|
admission.decision.reason, SafetyReason::EmergencyStopActive);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(SafetyCoordinatorTest, EnforceAllFailsClosedOnUnknownControlState)
|
TEST(SafetyManagerTest, EnforceAllFailsClosedOnUnknownControlState)
|
||||||
{
|
{
|
||||||
SafetyCoordinatorConfig config;
|
SafetyManagerConfig config;
|
||||||
config.enforcement_mode = EnforcementMode::EnforceAll;
|
config.enforcement_mode = EnforcementMode::EnforceAll;
|
||||||
SafetyCoordinator coordinator(config);
|
SafetyManager coordinator(config);
|
||||||
ASSERT_TRUE(coordinator.registerDevice({controlDescriptor(), {}, {}}));
|
ASSERT_TRUE(coordinator.registerDevice({controlDescriptor(), {}, {}}));
|
||||||
coordinator.markStartupComplete();
|
coordinator.markStartupComplete();
|
||||||
|
|
||||||
@ -273,11 +273,11 @@ TEST(SafetyCoordinatorTest, EnforceAllFailsClosedOnUnknownControlState)
|
|||||||
EXPECT_FALSE(result.permit.has_value());
|
EXPECT_FALSE(result.permit.has_value());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(SafetyCoordinatorTest, ControlSafetyBitsMustBeExplicitlyFalse)
|
TEST(SafetyManagerTest, ControlSafetyBitsMustBeExplicitlyFalse)
|
||||||
{
|
{
|
||||||
SafetyCoordinatorConfig config;
|
SafetyManagerConfig config;
|
||||||
config.enforcement_mode = EnforcementMode::EnforceAll;
|
config.enforcement_mode = EnforcementMode::EnforceAll;
|
||||||
SafetyCoordinator coordinator(config);
|
SafetyManager coordinator(config);
|
||||||
auto endpoint = std::make_shared<FakeEndpoint>(controlDescriptor());
|
auto endpoint = std::make_shared<FakeEndpoint>(controlDescriptor());
|
||||||
endpoint->protective_stop = TriState::Unknown;
|
endpoint->protective_stop = TriState::Unknown;
|
||||||
ASSERT_TRUE(coordinator.registerDevice(
|
ASSERT_TRUE(coordinator.registerDevice(
|
||||||
@ -296,11 +296,11 @@ TEST(SafetyCoordinatorTest, ControlSafetyBitsMustBeExplicitlyFalse)
|
|||||||
DeviceAdmissionState::Blocked);
|
DeviceAdmissionState::Blocked);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(SafetyCoordinatorTest, EnforcedDispatchRunsFinalHardwareCheck)
|
TEST(SafetyManagerTest, EnforcedDispatchRunsFinalHardwareCheck)
|
||||||
{
|
{
|
||||||
SafetyCoordinatorConfig config;
|
SafetyManagerConfig config;
|
||||||
config.enforcement_mode = EnforcementMode::EnforceAll;
|
config.enforcement_mode = EnforcementMode::EnforceAll;
|
||||||
SafetyCoordinator coordinator(config);
|
SafetyManager coordinator(config);
|
||||||
auto endpoint = std::make_shared<FakeEndpoint>(controlDescriptor());
|
auto endpoint = std::make_shared<FakeEndpoint>(controlDescriptor());
|
||||||
ASSERT_TRUE(coordinator.registerDevice(
|
ASSERT_TRUE(coordinator.registerDevice(
|
||||||
{controlDescriptor(), endpoint, {}}));
|
{controlDescriptor(), endpoint, {}}));
|
||||||
@ -317,12 +317,12 @@ TEST(SafetyCoordinatorTest, EnforcedDispatchRunsFinalHardwareCheck)
|
|||||||
EXPECT_EQ(endpoint->hardware_checks.load(), 1);
|
EXPECT_EQ(endpoint->hardware_checks.load(), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(SafetyCoordinatorTest,
|
TEST(SafetyManagerTest,
|
||||||
StartActivityMayEnterFromRestrictedButActuationMayNot)
|
StartActivityMayEnterFromRestrictedButActuationMayNot)
|
||||||
{
|
{
|
||||||
SafetyCoordinatorConfig config;
|
SafetyManagerConfig config;
|
||||||
config.enforcement_mode = EnforcementMode::EnforceAll;
|
config.enforcement_mode = EnforcementMode::EnforceAll;
|
||||||
SafetyCoordinator coordinator(config);
|
SafetyManager coordinator(config);
|
||||||
auto endpoint = std::make_shared<FakeEndpoint>(controlDescriptor());
|
auto endpoint = std::make_shared<FakeEndpoint>(controlDescriptor());
|
||||||
endpoint->condition = SafetyCondition::Restricted;
|
endpoint->condition = SafetyCondition::Restricted;
|
||||||
endpoint->ready = TriState::False;
|
endpoint->ready = TriState::False;
|
||||||
@ -346,11 +346,11 @@ TEST(SafetyCoordinatorTest,
|
|||||||
EXPECT_EQ(actuation.decision.reason, SafetyReason::HardwareUnsafe);
|
EXPECT_EQ(actuation.decision.reason, SafetyReason::HardwareUnsafe);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(SafetyCoordinatorTest, SuccessfulStopInvalidatesOldPermitAndReopens)
|
TEST(SafetyManagerTest, SuccessfulStopInvalidatesOldPermitAndReopens)
|
||||||
{
|
{
|
||||||
SafetyCoordinatorConfig config;
|
SafetyManagerConfig config;
|
||||||
config.enforcement_mode = EnforcementMode::EnforceAll;
|
config.enforcement_mode = EnforcementMode::EnforceAll;
|
||||||
SafetyCoordinator coordinator(config);
|
SafetyManager coordinator(config);
|
||||||
auto endpoint = std::make_shared<FakeEndpoint>(controlDescriptor());
|
auto endpoint = std::make_shared<FakeEndpoint>(controlDescriptor());
|
||||||
auto participant = std::make_shared<FakeParticipant>();
|
auto participant = std::make_shared<FakeParticipant>();
|
||||||
ASSERT_TRUE(coordinator.registerDevice(
|
ASSERT_TRUE(coordinator.registerDevice(
|
||||||
@ -388,11 +388,11 @@ TEST(SafetyCoordinatorTest, SuccessfulStopInvalidatesOldPermitAndReopens)
|
|||||||
EXPECT_TRUE(snapshot.participants.front().last_release.success);
|
EXPECT_TRUE(snapshot.participants.front().last_release.success);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(SafetyCoordinatorTest, FailedStopRequiresVerifiedRecovery)
|
TEST(SafetyManagerTest, FailedStopRequiresVerifiedRecovery)
|
||||||
{
|
{
|
||||||
SafetyCoordinatorConfig config;
|
SafetyManagerConfig config;
|
||||||
config.enforcement_mode = EnforcementMode::EnforceAll;
|
config.enforcement_mode = EnforcementMode::EnforceAll;
|
||||||
SafetyCoordinator coordinator(config);
|
SafetyManager coordinator(config);
|
||||||
auto endpoint = std::make_shared<FakeEndpoint>(controlDescriptor());
|
auto endpoint = std::make_shared<FakeEndpoint>(controlDescriptor());
|
||||||
auto participant = std::make_shared<FakeParticipant>();
|
auto participant = std::make_shared<FakeParticipant>();
|
||||||
participant->verify_result = {
|
participant->verify_result = {
|
||||||
@ -437,9 +437,9 @@ TEST(SafetyCoordinatorTest, FailedStopRequiresVerifiedRecovery)
|
|||||||
EXPECT_TRUE(reopened.participants.front().last_release.success);
|
EXPECT_TRUE(reopened.participants.front().last_release.success);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(SafetyCoordinatorTest, RecoveryCannotIgnoreEmergencyStop)
|
TEST(SafetyManagerTest, RecoveryCannotIgnoreEmergencyStop)
|
||||||
{
|
{
|
||||||
SafetyCoordinator coordinator;
|
SafetyManager coordinator;
|
||||||
auto endpoint = std::make_shared<FakeEndpoint>(controlDescriptor());
|
auto endpoint = std::make_shared<FakeEndpoint>(controlDescriptor());
|
||||||
auto participant = std::make_shared<FakeParticipant>();
|
auto participant = std::make_shared<FakeParticipant>();
|
||||||
ASSERT_TRUE(coordinator.registerDevice(
|
ASSERT_TRUE(coordinator.registerDevice(
|
||||||
@ -466,9 +466,9 @@ TEST(SafetyCoordinatorTest, RecoveryCannotIgnoreEmergencyStop)
|
|||||||
EXPECT_EQ(endpoint->recoveries.load(), 0);
|
EXPECT_EQ(endpoint->recoveries.load(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(SafetyCoordinatorTest, RecoveryAuditFailureCannotReleaseLatch)
|
TEST(SafetyManagerTest, RecoveryAuditFailureCannotReleaseLatch)
|
||||||
{
|
{
|
||||||
SafetyCoordinator coordinator;
|
SafetyManager coordinator;
|
||||||
auto endpoint = std::make_shared<FakeEndpoint>(controlDescriptor());
|
auto endpoint = std::make_shared<FakeEndpoint>(controlDescriptor());
|
||||||
auto participant = std::make_shared<FakeParticipant>();
|
auto participant = std::make_shared<FakeParticipant>();
|
||||||
participant->verify_result = {
|
participant->verify_result = {
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "manager/safety/include/safety_snapshot_store.h"
|
#include "manager/safety_manager/include/safety_snapshot_store.h"
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
#include "common/base/logging/logger.h"
|
#include "common/base/logging/logger.h"
|
||||||
#include "common/config/config_files.h"
|
#include "common/config/config_files.h"
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
#include "task/task_factory.h"
|
#include "task/task_factory.h"
|
||||||
|
|
||||||
using namespace cmvr;
|
using namespace cmvr;
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
#include "task/task_factory.h"
|
#include "task/task_factory.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|||||||
@ -1,548 +1,4 @@
|
|||||||
|
# Service is intentionally split by transport. The QUIC edge target is added
|
||||||
add_library(service
|
# from the project root before task targets; the gRPC tree is added here after
|
||||||
stop_all/src/stop_operation_dispatcher.cpp
|
# its manager and task dependencies are available.
|
||||||
action/src/action_queue_executor.cpp
|
add_subdirectory(grpc)
|
||||||
grpc/src/camera_ptz_activity_registry.cpp
|
|
||||||
grpc/src/media_activity_coordinator.cpp
|
|
||||||
grpc/src/motor_activity_coordinator.cpp
|
|
||||||
grpc/src/grpc_camera_service.cpp
|
|
||||||
grpc/src/grpc_command_transaction.cpp
|
|
||||||
grpc/src/grpc_error_logging_interceptor.cpp
|
|
||||||
grpc/src/grpc_recovery_audit.cpp
|
|
||||||
grpc/src/grpc_safety_proto.cpp
|
|
||||||
grpc/src/grpc_safety_participants.cpp
|
|
||||||
grpc/src/grpc_security.cpp
|
|
||||||
grpc/src/grpc_system_service.cpp
|
|
||||||
grpc/src/grpc_speaker_service.cpp
|
|
||||||
grpc/src/grpc_microphone_service.cpp
|
|
||||||
grpc/src/grpc_head_service.cpp
|
|
||||||
grpc/src/grpc_dexhand_service.cpp
|
|
||||||
grpc/src/grpc_arm_service.cpp
|
|
||||||
grpc/src/grpc_arm_teleop_service.cpp
|
|
||||||
grpc/src/grpc_robot_arm_teleop_backend.cpp
|
|
||||||
grpc/src/grpc_motor_service.cpp
|
|
||||||
grpc/src/grpc_agv_service.cpp
|
|
||||||
grpc/src/grpc_hlc_service.cpp
|
|
||||||
../task/grpc_server_task/src/grpc_server_task.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
target_include_directories(service PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
|
||||||
|
|
||||||
target_link_libraries(service PRIVATE
|
|
||||||
cmvr_es::proto
|
|
||||||
cmvr_es::stop_all_admission_gate
|
|
||||||
cmvr_es::camera_operational_activity_registry
|
|
||||||
osqp
|
|
||||||
cmvr_es::control_authority
|
|
||||||
cmvr_es::device_manager
|
|
||||||
cmvr_es::task_manager
|
|
||||||
cmvr_es::algorithms::controller
|
|
||||||
cmvr_es::task
|
|
||||||
cmvr_es::media_source_hub
|
|
||||||
cmvr_es::device_media_source_adapter
|
|
||||||
protobuf::libprotobuf
|
|
||||||
)
|
|
||||||
|
|
||||||
add_library(cmvr_es::service ALIAS service)
|
|
||||||
install(TARGETS service LIBRARY DESTINATION lib)
|
|
||||||
|
|
||||||
if(BUILD_TESTING)
|
|
||||||
add_executable(stop_all_admission_gate_test
|
|
||||||
stop_all/tests/stop_all_admission_gate_test.cpp
|
|
||||||
stop_all/src/stop_all_admission_gate.cpp
|
|
||||||
)
|
|
||||||
target_include_directories(stop_all_admission_gate_test
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es
|
|
||||||
)
|
|
||||||
target_link_libraries(stop_all_admission_gate_test PRIVATE
|
|
||||||
gtest
|
|
||||||
gtest_main
|
|
||||||
pthread
|
|
||||||
)
|
|
||||||
add_test(
|
|
||||||
NAME stop_all_admission_gate_test
|
|
||||||
COMMAND stop_all_admission_gate_test
|
|
||||||
)
|
|
||||||
set_tests_properties(stop_all_admission_gate_test PROPERTIES TIMEOUT 10)
|
|
||||||
|
|
||||||
add_executable(stop_operation_dispatcher_test
|
|
||||||
stop_all/tests/stop_operation_dispatcher_test.cpp
|
|
||||||
stop_all/src/stop_operation_dispatcher.cpp
|
|
||||||
)
|
|
||||||
target_include_directories(stop_operation_dispatcher_test
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es
|
|
||||||
)
|
|
||||||
target_link_libraries(stop_operation_dispatcher_test PRIVATE
|
|
||||||
gtest
|
|
||||||
gtest_main
|
|
||||||
pthread
|
|
||||||
)
|
|
||||||
add_test(
|
|
||||||
NAME stop_operation_dispatcher_test
|
|
||||||
COMMAND stop_operation_dispatcher_test
|
|
||||||
)
|
|
||||||
set_tests_properties(stop_operation_dispatcher_test PROPERTIES TIMEOUT 10)
|
|
||||||
|
|
||||||
add_executable(camera_operational_activity_registry_test
|
|
||||||
grpc/tests/camera_operational_activity_registry_test.cpp
|
|
||||||
)
|
|
||||||
target_include_directories(camera_operational_activity_registry_test
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es
|
|
||||||
)
|
|
||||||
target_link_libraries(camera_operational_activity_registry_test PRIVATE
|
|
||||||
cmvr_es::proto
|
|
||||||
cmvr_es::camera_operational_activity_registry
|
|
||||||
gtest
|
|
||||||
gtest_main
|
|
||||||
pthread
|
|
||||||
)
|
|
||||||
add_test(
|
|
||||||
NAME camera_operational_activity_registry_test
|
|
||||||
COMMAND camera_operational_activity_registry_test
|
|
||||||
)
|
|
||||||
set_tests_properties(camera_operational_activity_registry_test PROPERTIES
|
|
||||||
TIMEOUT 10)
|
|
||||||
|
|
||||||
add_executable(camera_ptz_activity_registry_test
|
|
||||||
grpc/tests/camera_ptz_activity_registry_test.cpp
|
|
||||||
grpc/src/camera_ptz_activity_registry.cpp
|
|
||||||
stop_all/src/stop_all_admission_gate.cpp
|
|
||||||
)
|
|
||||||
target_include_directories(camera_ptz_activity_registry_test
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es
|
|
||||||
)
|
|
||||||
target_link_libraries(camera_ptz_activity_registry_test PRIVATE
|
|
||||||
cmvr_es::proto
|
|
||||||
gtest
|
|
||||||
gtest_main
|
|
||||||
pthread
|
|
||||||
)
|
|
||||||
add_test(
|
|
||||||
NAME camera_ptz_activity_registry_test
|
|
||||||
COMMAND camera_ptz_activity_registry_test
|
|
||||||
)
|
|
||||||
set_tests_properties(camera_ptz_activity_registry_test PROPERTIES TIMEOUT 10)
|
|
||||||
|
|
||||||
add_executable(media_activity_coordinator_test
|
|
||||||
grpc/tests/media_activity_coordinator_test.cpp
|
|
||||||
grpc/src/media_activity_coordinator.cpp
|
|
||||||
stop_all/src/stop_all_admission_gate.cpp
|
|
||||||
)
|
|
||||||
target_include_directories(media_activity_coordinator_test
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es
|
|
||||||
)
|
|
||||||
target_link_libraries(media_activity_coordinator_test PRIVATE
|
|
||||||
cmvr_es::logging
|
|
||||||
pthread
|
|
||||||
)
|
|
||||||
add_test(
|
|
||||||
NAME media_activity_coordinator_test
|
|
||||||
COMMAND media_activity_coordinator_test
|
|
||||||
)
|
|
||||||
set(_grpc_media_test_environment
|
|
||||||
"LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}"
|
|
||||||
)
|
|
||||||
if(CMVR_TEST_SYSTEM_LIBSTDCXX)
|
|
||||||
list(APPEND _grpc_media_test_environment
|
|
||||||
"LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}")
|
|
||||||
endif()
|
|
||||||
set_tests_properties(media_activity_coordinator_test PROPERTIES
|
|
||||||
TIMEOUT 10
|
|
||||||
ENVIRONMENT "${_grpc_media_test_environment}"
|
|
||||||
)
|
|
||||||
|
|
||||||
add_executable(motor_activity_coordinator_test
|
|
||||||
grpc/tests/motor_activity_coordinator_test.cpp
|
|
||||||
grpc/src/motor_activity_coordinator.cpp
|
|
||||||
)
|
|
||||||
target_include_directories(motor_activity_coordinator_test
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es
|
|
||||||
)
|
|
||||||
target_link_libraries(motor_activity_coordinator_test PRIVATE
|
|
||||||
cmvr_es::logging
|
|
||||||
pthread
|
|
||||||
)
|
|
||||||
add_test(
|
|
||||||
NAME motor_activity_coordinator_test
|
|
||||||
COMMAND motor_activity_coordinator_test
|
|
||||||
)
|
|
||||||
set_tests_properties(motor_activity_coordinator_test PROPERTIES
|
|
||||||
TIMEOUT 10
|
|
||||||
ENVIRONMENT "${_grpc_media_test_environment}"
|
|
||||||
)
|
|
||||||
|
|
||||||
add_executable(grpc_camera_stream_policy_test
|
|
||||||
grpc/tests/grpc_camera_stream_policy_test.cpp
|
|
||||||
)
|
|
||||||
target_include_directories(grpc_camera_stream_policy_test
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es
|
|
||||||
)
|
|
||||||
add_test(
|
|
||||||
NAME grpc_camera_stream_policy_test
|
|
||||||
COMMAND grpc_camera_stream_policy_test
|
|
||||||
)
|
|
||||||
set_tests_properties(grpc_camera_stream_policy_test PROPERTIES TIMEOUT 10)
|
|
||||||
|
|
||||||
add_executable(grpc_system_service_test
|
|
||||||
grpc/tests/grpc_system_service_test.cpp
|
|
||||||
)
|
|
||||||
target_include_directories(grpc_system_service_test
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es/manager/device_manager
|
|
||||||
)
|
|
||||||
target_link_libraries(grpc_system_service_test
|
|
||||||
PRIVATE
|
|
||||||
service
|
|
||||||
cmvr_es::proto
|
|
||||||
gtest
|
|
||||||
gtest_main
|
|
||||||
pthread
|
|
||||||
)
|
|
||||||
add_test(
|
|
||||||
NAME grpc_system_service_test
|
|
||||||
COMMAND grpc_system_service_test
|
|
||||||
)
|
|
||||||
set(_grpc_system_test_environment
|
|
||||||
"LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}"
|
|
||||||
)
|
|
||||||
if(CMVR_TEST_SYSTEM_LIBSTDCXX)
|
|
||||||
list(APPEND _grpc_system_test_environment
|
|
||||||
"LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}")
|
|
||||||
endif()
|
|
||||||
set_tests_properties(grpc_system_service_test PROPERTIES
|
|
||||||
TIMEOUT 10
|
|
||||||
ENVIRONMENT "${_grpc_system_test_environment}"
|
|
||||||
)
|
|
||||||
|
|
||||||
add_executable(grpc_error_logging_interceptor_test
|
|
||||||
grpc/tests/grpc_error_logging_interceptor_test.cpp
|
|
||||||
grpc/src/grpc_error_logging_interceptor.cpp
|
|
||||||
)
|
|
||||||
target_include_directories(grpc_error_logging_interceptor_test
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es
|
|
||||||
)
|
|
||||||
target_link_libraries(grpc_error_logging_interceptor_test
|
|
||||||
PRIVATE
|
|
||||||
cmvr_es::logging
|
|
||||||
cmvr_es::proto
|
|
||||||
gtest
|
|
||||||
gtest_main
|
|
||||||
pthread
|
|
||||||
)
|
|
||||||
add_test(
|
|
||||||
NAME grpc_error_logging_interceptor_test
|
|
||||||
COMMAND grpc_error_logging_interceptor_test
|
|
||||||
)
|
|
||||||
set_tests_properties(grpc_error_logging_interceptor_test PROPERTIES
|
|
||||||
TIMEOUT 10
|
|
||||||
ENVIRONMENT "${_grpc_system_test_environment}"
|
|
||||||
)
|
|
||||||
|
|
||||||
add_executable(grpc_security_test
|
|
||||||
grpc/tests/grpc_security_test.cpp
|
|
||||||
grpc/src/grpc_security.cpp
|
|
||||||
)
|
|
||||||
target_include_directories(grpc_security_test
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es
|
|
||||||
)
|
|
||||||
target_link_libraries(grpc_security_test
|
|
||||||
PRIVATE
|
|
||||||
cmvr_es::proto
|
|
||||||
gtest
|
|
||||||
gtest_main
|
|
||||||
pthread
|
|
||||||
)
|
|
||||||
add_test(
|
|
||||||
NAME grpc_security_test
|
|
||||||
COMMAND grpc_security_test
|
|
||||||
)
|
|
||||||
set_tests_properties(grpc_security_test PROPERTIES
|
|
||||||
TIMEOUT 10
|
|
||||||
ENVIRONMENT "${_grpc_system_test_environment}"
|
|
||||||
)
|
|
||||||
|
|
||||||
add_executable(grpc_command_transaction_test
|
|
||||||
grpc/tests/grpc_command_transaction_test.cpp
|
|
||||||
grpc/src/grpc_command_transaction.cpp
|
|
||||||
grpc/src/grpc_safety_proto.cpp
|
|
||||||
grpc/src/grpc_security.cpp
|
|
||||||
)
|
|
||||||
target_include_directories(grpc_command_transaction_test
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es
|
|
||||||
)
|
|
||||||
target_link_libraries(grpc_command_transaction_test PRIVATE
|
|
||||||
cmvr_es::safety_coordinator
|
|
||||||
cmvr_es::proto
|
|
||||||
gtest
|
|
||||||
gtest_main
|
|
||||||
pthread
|
|
||||||
)
|
|
||||||
add_test(
|
|
||||||
NAME grpc_command_transaction_test
|
|
||||||
COMMAND grpc_command_transaction_test
|
|
||||||
)
|
|
||||||
set_tests_properties(grpc_command_transaction_test PROPERTIES
|
|
||||||
TIMEOUT 10
|
|
||||||
ENVIRONMENT "${_grpc_system_test_environment}"
|
|
||||||
)
|
|
||||||
|
|
||||||
add_executable(grpc_arm_service_test
|
|
||||||
grpc/tests/grpc_arm_service_test.cpp
|
|
||||||
)
|
|
||||||
target_include_directories(grpc_arm_service_test
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es/manager/device_manager
|
|
||||||
)
|
|
||||||
target_link_libraries(grpc_arm_service_test
|
|
||||||
PRIVATE
|
|
||||||
service
|
|
||||||
cmvr_es::proto
|
|
||||||
gtest
|
|
||||||
gtest_main
|
|
||||||
pthread
|
|
||||||
)
|
|
||||||
add_test(
|
|
||||||
NAME grpc_arm_service_test
|
|
||||||
COMMAND grpc_arm_service_test
|
|
||||||
)
|
|
||||||
set_tests_properties(grpc_arm_service_test PROPERTIES
|
|
||||||
TIMEOUT 10
|
|
||||||
ENVIRONMENT "${_grpc_system_test_environment}"
|
|
||||||
)
|
|
||||||
|
|
||||||
add_executable(grpc_arm_teleop_service_test
|
|
||||||
grpc/tests/grpc_arm_teleop_service_test.cpp
|
|
||||||
)
|
|
||||||
target_include_directories(grpc_arm_teleop_service_test
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es
|
|
||||||
)
|
|
||||||
target_link_libraries(grpc_arm_teleop_service_test
|
|
||||||
PRIVATE
|
|
||||||
service
|
|
||||||
cmvr_es::proto
|
|
||||||
gtest
|
|
||||||
gtest_main
|
|
||||||
pthread
|
|
||||||
)
|
|
||||||
add_test(
|
|
||||||
NAME grpc_arm_teleop_service_test
|
|
||||||
COMMAND grpc_arm_teleop_service_test
|
|
||||||
)
|
|
||||||
set(_grpc_arm_teleop_test_environment
|
|
||||||
"LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}"
|
|
||||||
)
|
|
||||||
if(CMVR_TEST_SYSTEM_LIBSTDCXX)
|
|
||||||
list(APPEND _grpc_arm_teleop_test_environment
|
|
||||||
"LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}")
|
|
||||||
endif()
|
|
||||||
set_tests_properties(grpc_arm_teleop_service_test PROPERTIES
|
|
||||||
TIMEOUT 20
|
|
||||||
ENVIRONMENT "${_grpc_arm_teleop_test_environment}"
|
|
||||||
)
|
|
||||||
|
|
||||||
add_executable(grpc_robot_arm_teleop_backend_test
|
|
||||||
grpc/tests/grpc_robot_arm_teleop_backend_test.cpp
|
|
||||||
)
|
|
||||||
target_include_directories(grpc_robot_arm_teleop_backend_test
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es
|
|
||||||
)
|
|
||||||
target_link_libraries(grpc_robot_arm_teleop_backend_test
|
|
||||||
PRIVATE
|
|
||||||
service
|
|
||||||
cmvr_es::proto
|
|
||||||
gtest
|
|
||||||
gtest_main
|
|
||||||
pthread
|
|
||||||
)
|
|
||||||
add_test(
|
|
||||||
NAME grpc_robot_arm_teleop_backend_test
|
|
||||||
COMMAND grpc_robot_arm_teleop_backend_test
|
|
||||||
)
|
|
||||||
set_tests_properties(grpc_robot_arm_teleop_backend_test PROPERTIES
|
|
||||||
TIMEOUT 10
|
|
||||||
ENVIRONMENT "${_grpc_arm_teleop_test_environment}"
|
|
||||||
)
|
|
||||||
|
|
||||||
add_executable(grpc_motor_service_test
|
|
||||||
grpc/tests/grpc_motor_service_test.cpp
|
|
||||||
)
|
|
||||||
target_include_directories(grpc_motor_service_test
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es/manager/device_manager
|
|
||||||
)
|
|
||||||
target_link_libraries(grpc_motor_service_test
|
|
||||||
PRIVATE
|
|
||||||
service
|
|
||||||
gtest
|
|
||||||
gtest_main
|
|
||||||
pthread
|
|
||||||
)
|
|
||||||
add_test(
|
|
||||||
NAME grpc_motor_service_test
|
|
||||||
COMMAND grpc_motor_service_test
|
|
||||||
)
|
|
||||||
set(_grpc_motor_test_environment
|
|
||||||
"LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}"
|
|
||||||
)
|
|
||||||
if(CMVR_TEST_SYSTEM_LIBSTDCXX)
|
|
||||||
list(APPEND _grpc_motor_test_environment
|
|
||||||
"LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}")
|
|
||||||
endif()
|
|
||||||
set_tests_properties(grpc_motor_service_test PROPERTIES
|
|
||||||
TIMEOUT 10
|
|
||||||
ENVIRONMENT "${_grpc_motor_test_environment}"
|
|
||||||
)
|
|
||||||
|
|
||||||
add_executable(grpc_agv_service_test
|
|
||||||
grpc/tests/grpc_agv_service_test.cpp
|
|
||||||
)
|
|
||||||
target_include_directories(grpc_agv_service_test
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es/manager/device_manager
|
|
||||||
)
|
|
||||||
target_link_libraries(grpc_agv_service_test
|
|
||||||
PRIVATE
|
|
||||||
service
|
|
||||||
gtest
|
|
||||||
gtest_main
|
|
||||||
pthread
|
|
||||||
)
|
|
||||||
add_test(
|
|
||||||
NAME grpc_agv_service_test
|
|
||||||
COMMAND grpc_agv_service_test
|
|
||||||
)
|
|
||||||
set(_grpc_agv_test_environment
|
|
||||||
"LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}"
|
|
||||||
)
|
|
||||||
if(CMVR_TEST_SYSTEM_LIBSTDCXX)
|
|
||||||
list(APPEND _grpc_agv_test_environment
|
|
||||||
"LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}")
|
|
||||||
endif()
|
|
||||||
set_tests_properties(grpc_agv_service_test PROPERTIES
|
|
||||||
TIMEOUT 10
|
|
||||||
ENVIRONMENT "${_grpc_agv_test_environment}"
|
|
||||||
)
|
|
||||||
|
|
||||||
add_executable(grpc_head_service_test
|
|
||||||
grpc/tests/grpc_head_service_test.cpp
|
|
||||||
)
|
|
||||||
target_include_directories(grpc_head_service_test
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es/manager/device_manager
|
|
||||||
)
|
|
||||||
target_link_libraries(grpc_head_service_test
|
|
||||||
PRIVATE
|
|
||||||
service
|
|
||||||
cmvr_es::proto
|
|
||||||
gtest
|
|
||||||
gtest_main
|
|
||||||
pthread
|
|
||||||
)
|
|
||||||
add_test(
|
|
||||||
NAME grpc_head_service_test
|
|
||||||
COMMAND grpc_head_service_test
|
|
||||||
)
|
|
||||||
set_tests_properties(grpc_head_service_test PROPERTIES
|
|
||||||
TIMEOUT 15
|
|
||||||
ENVIRONMENT "${_grpc_system_test_environment}"
|
|
||||||
)
|
|
||||||
|
|
||||||
add_executable(grpc_dexhand_service_test
|
|
||||||
grpc/tests/grpc_dexhand_service_test.cpp
|
|
||||||
)
|
|
||||||
target_include_directories(grpc_dexhand_service_test
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es
|
|
||||||
${CMAKE_SOURCE_DIR}/cmvr-es/manager/device_manager
|
|
||||||
)
|
|
||||||
target_link_libraries(grpc_dexhand_service_test
|
|
||||||
PRIVATE
|
|
||||||
service
|
|
||||||
cmvr_es::proto
|
|
||||||
gtest
|
|
||||||
gtest_main
|
|
||||||
pthread
|
|
||||||
)
|
|
||||||
add_test(
|
|
||||||
NAME grpc_dexhand_service_test
|
|
||||||
COMMAND grpc_dexhand_service_test
|
|
||||||
)
|
|
||||||
set_tests_properties(grpc_dexhand_service_test PROPERTIES
|
|
||||||
TIMEOUT 15
|
|
||||||
ENVIRONMENT "${_grpc_system_test_environment}"
|
|
||||||
)
|
|
||||||
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# --------------------------------------------------------
|
|
||||||
# Unit test
|
|
||||||
# --------------------------------------------------------
|
|
||||||
find_package(OpenCV REQUIRED)
|
|
||||||
|
|
||||||
include_directories(
|
|
||||||
${CMAKE_SOURCE_DIR}/third_party/gtest/1.17.0/include
|
|
||||||
)
|
|
||||||
|
|
||||||
link_directories(
|
|
||||||
${CMAKE_SOURCE_DIR}/third_party/gtest/1.17.0/lib
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
add_executable(grpc_arm_client_test
|
|
||||||
grpc/src/grpc_arm_client_test.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
target_link_libraries(grpc_arm_client_test
|
|
||||||
PRIVATE
|
|
||||||
cmvr_es::device::canbus
|
|
||||||
cmvr_es::device::ti5_canopen_motor_driver
|
|
||||||
osqp
|
|
||||||
gtest
|
|
||||||
gtest_main
|
|
||||||
pthread
|
|
||||||
glog
|
|
||||||
cmvr_es::proto
|
|
||||||
ccd
|
|
||||||
fcl
|
|
||||||
cmvr_es::device_manager
|
|
||||||
${OpenCV_LIBS}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
add_executable(grpc_hlc_client_test
|
|
||||||
grpc/src/grpc_hlc_client_test.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
target_link_libraries(grpc_hlc_client_test
|
|
||||||
PRIVATE
|
|
||||||
cmvr_es::device::canbus
|
|
||||||
cmvr_es::device::ti5_canopen_motor_driver
|
|
||||||
osqp
|
|
||||||
gtest
|
|
||||||
gtest_main
|
|
||||||
pthread
|
|
||||||
glog
|
|
||||||
cmvr_es::proto
|
|
||||||
ccd
|
|
||||||
fcl
|
|
||||||
cmvr_es::device_manager
|
|
||||||
)
|
|
||||||
|
|||||||
@ -6,14 +6,33 @@
|
|||||||
|
|
||||||
## 当前结构
|
## 当前结构
|
||||||
|
|
||||||
|
`service/` 顶层只按传输协议保留两个子目录:`grpc/` 和 `quic_edge/`。gRPC
|
||||||
|
内部再按运行角色分层,避免把队列、停止控制、客户端和服务端实现混在同一层。
|
||||||
|
|
||||||
|
```text
|
||||||
|
service/
|
||||||
|
├── grpc/
|
||||||
|
│ ├── action/ # ActionQueue 校验、账本和 FIFO 执行器
|
||||||
|
│ ├── client/ # 边缘端使用的 gRPC client
|
||||||
|
│ ├── server/ # gRPC service、协调器和安全扩展
|
||||||
|
│ │ ├── include/
|
||||||
|
│ │ ├── src/
|
||||||
|
│ │ └── tests/
|
||||||
|
│ └── stop_all/ # 高优先级 StopAll 通道
|
||||||
|
└── quic_edge/ # QUIC client、控制状态机和媒体 packetizer
|
||||||
|
```
|
||||||
|
|
||||||
| 目录 | 职责 |
|
| 目录 | 职责 |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| `action/` | SystemService ActionQueue 的校验、幂等账本和边缘端 FIFO 执行器 |
|
| `grpc/action/` | SystemService ActionQueue 的校验、幂等账本和边缘端 FIFO 执行器 |
|
||||||
| `grpc/` | 入站设备控制、状态查询和兼容流式接口 |
|
| `grpc/client/` | 面向边缘端内部调用的 gRPC client |
|
||||||
|
| `grpc/server/` | 入站设备控制、状态查询、兼容流式接口和安全控制面 |
|
||||||
|
| `grpc/stop_all/` | 不进入普通命令队列的高优先级停止通道 |
|
||||||
| `quic_edge/` | 边缘端主动连接平台的 QUIC client、控制状态机和媒体 packetizer |
|
| `quic_edge/` | 边缘端主动连接平台的 QUIC client、控制状态机和媒体 packetizer |
|
||||||
| `quic_edge/tests/` | 已登记到 CTest 的 QUIC 协议测试 |
|
| `quic_edge/tests/` | 已登记到 CTest 的 QUIC 协议测试 |
|
||||||
|
|
||||||
两个遗留 gRPC client test 位于 `grpc/src/*_client_test.cpp`,当前没有通过 `add_test()` 登记。
|
两个遗留 gRPC client test 位于 `grpc/server/tests/*_client_test.cpp`,当前没有通过
|
||||||
|
`add_test()` 登记;它们是历史可执行文件,不代表默认自动覆盖。
|
||||||
|
|
||||||
gRPC 和 QUIC 的职责边界:
|
gRPC 和 QUIC 的职责边界:
|
||||||
|
|
||||||
@ -99,10 +118,10 @@ ActionQueue 遵循以下执行语义:
|
|||||||
|
|
||||||
- Proto:[`../../protos/cmvr/api/motor_service.proto`](../../protos/cmvr/api/motor_service.proto)
|
- Proto:[`../../protos/cmvr/api/motor_service.proto`](../../protos/cmvr/api/motor_service.proto)
|
||||||
和 [`../../protos/cmvr/api/motor_command.proto`](../../protos/cmvr/api/motor_command.proto)
|
和 [`../../protos/cmvr/api/motor_command.proto`](../../protos/cmvr/api/motor_command.proto)
|
||||||
- 实现:[`grpc/include/grpc_motor_service.h`](grpc/include/grpc_motor_service.h)
|
- 实现:[`grpc/server/include/grpc_motor_service.h`](grpc/server/include/grpc_motor_service.h)
|
||||||
和 [`grpc/src/grpc_motor_service.cpp`](grpc/src/grpc_motor_service.cpp)
|
和 [`grpc/server/src/grpc_motor_service.cpp`](grpc/server/src/grpc_motor_service.cpp)
|
||||||
- 注册:[`../task/grpc_server_task/src/grpc_server_task.cpp`](../task/grpc_server_task/src/grpc_server_task.cpp)
|
- 注册:[`../task/grpc_server_task/src/grpc_server_task.cpp`](../task/grpc_server_task/src/grpc_server_task.cpp)
|
||||||
- 单元测试:[`grpc/tests/grpc_motor_service_test.cpp`](grpc/tests/grpc_motor_service_test.cpp)
|
- 单元测试:[`grpc/server/tests/grpc_motor_service_test.cpp`](grpc/server/tests/grpc_motor_service_test.cpp)
|
||||||
|
|
||||||
服务按单电机仲裁。同步 Profile 命令、Cyclic Position/Velocity 双向流、
|
服务按单电机仲裁。同步 Profile 命令、Cyclic Position/Velocity 双向流、
|
||||||
`setEnabled`、状态读取和软件 `emergencyStop` 共用同一控制权状态:
|
`setEnabled`、状态读取和软件 `emergencyStop` 共用同一控制权状态:
|
||||||
@ -140,6 +159,7 @@ import 路径必须相对于 `protos/`。兼容规则见 [`../../protos/README.m
|
|||||||
|
|
||||||
```text
|
```text
|
||||||
service/grpc/
|
service/grpc/
|
||||||
|
└── server/
|
||||||
├── include/grpc_example_service.h
|
├── include/grpc_example_service.h
|
||||||
└── src/grpc_example_service.cpp
|
└── src/grpc_example_service.cpp
|
||||||
```
|
```
|
||||||
@ -203,7 +223,7 @@ cmvr::api::ExampleService::Service
|
|||||||
|
|
||||||
- 检查 `context->IsCancelled()`;
|
- 检查 `context->IsCancelled()`;
|
||||||
- 检查 `Read()` / `Write()` 返回;
|
- 检查 `Read()` / `Write()` 返回;
|
||||||
- 使用 RAII 或 MediaSourceHub Subscription 释放 producer lease;
|
- 使用 RAII 或 MediaSourceManager Subscription 释放 producer lease;
|
||||||
- 不持有设备状态锁进行网络写;
|
- 不持有设备状态锁进行网络写;
|
||||||
- 为 wait/read 使用有限 timeout;
|
- 为 wait/read 使用有限 timeout;
|
||||||
- 慢客户端不能阻塞设备生产线程;
|
- 慢客户端不能阻塞设备生产线程;
|
||||||
@ -211,7 +231,7 @@ cmvr::api::ExampleService::Service
|
|||||||
- gRPC RGB 流在积压超过 `camera_stream_max_pending_frames` 或帧龄超过
|
- gRPC RGB 流在积压超过 `camera_stream_max_pending_frames` 或帧龄超过
|
||||||
`camera_stream_max_frame_age_ms` 时主动丢弃旧帧,请求 IDR,并从下一个关键帧恢复。
|
`camera_stream_max_frame_age_ms` 时主动丢弃旧帧,请求 IDR,并从下一个关键帧恢复。
|
||||||
|
|
||||||
当前仅 gRPC RGB 和麦克风流使用 MediaSourceHub;Depth/RGBD 仍直接读取设备帧。
|
当前仅 gRPC RGB 和麦克风流使用 MediaSourceManager;Depth/RGBD 仍直接读取设备帧。
|
||||||
|
|
||||||
gRPC 相机实时流默认最多保留 2 帧积压、最大允许 250 ms 帧龄。两个配置项填 0
|
gRPC 相机实时流默认最多保留 2 帧积压、最大允许 250 ms 帧龄。两个配置项填 0
|
||||||
时使用上述默认值。该策略以低延迟为目标,不保证每个视频帧都到达客户端;控制命令
|
时使用上述默认值。该策略以低延迟为目标,不保证每个视频帧都到达客户端;控制命令
|
||||||
|
|||||||
550
cmvr-es/service/grpc/CMakeLists.txt
Normal file
550
cmvr-es/service/grpc/CMakeLists.txt
Normal file
@ -0,0 +1,550 @@
|
|||||||
|
|
||||||
|
add_library(service
|
||||||
|
stop_all/src/stop_operation_dispatcher.cpp
|
||||||
|
action/src/action_queue_executor.cpp
|
||||||
|
server/src/camera_ptz_activity_registry.cpp
|
||||||
|
server/src/media_activity_coordinator.cpp
|
||||||
|
server/src/motor_activity_coordinator.cpp
|
||||||
|
server/src/grpc_camera_service.cpp
|
||||||
|
server/src/grpc_command_transaction.cpp
|
||||||
|
server/src/grpc_error_logging_interceptor.cpp
|
||||||
|
server/src/grpc_recovery_audit.cpp
|
||||||
|
server/src/grpc_safety_proto.cpp
|
||||||
|
server/src/grpc_safety_participants.cpp
|
||||||
|
server/src/grpc_security.cpp
|
||||||
|
server/src/grpc_system_service.cpp
|
||||||
|
server/src/grpc_speaker_service.cpp
|
||||||
|
server/src/grpc_microphone_service.cpp
|
||||||
|
server/src/grpc_head_service.cpp
|
||||||
|
server/src/grpc_dexhand_service.cpp
|
||||||
|
server/src/grpc_arm_service.cpp
|
||||||
|
server/src/grpc_arm_teleop_service.cpp
|
||||||
|
server/src/grpc_robot_arm_teleop_backend.cpp
|
||||||
|
server/src/grpc_motor_service.cpp
|
||||||
|
server/src/grpc_agv_service.cpp
|
||||||
|
server/src/grpc_hlc_service.cpp
|
||||||
|
../../task/grpc_server_task/src/grpc_server_task.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(service PUBLIC
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(service PRIVATE
|
||||||
|
cmvr_es::proto
|
||||||
|
cmvr_es::stop_all_admission_gate
|
||||||
|
cmvr_es::camera_operational_activity_registry
|
||||||
|
osqp
|
||||||
|
cmvr_es::control_authority_manager
|
||||||
|
cmvr_es::device_manager
|
||||||
|
cmvr_es::task_manager
|
||||||
|
cmvr_es::algorithms::controller
|
||||||
|
cmvr_es::task
|
||||||
|
cmvr_es::media_source_manager
|
||||||
|
cmvr_es::device_media_source_adapter
|
||||||
|
protobuf::libprotobuf
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(cmvr_es::service ALIAS service)
|
||||||
|
install(TARGETS service LIBRARY DESTINATION lib)
|
||||||
|
|
||||||
|
if(BUILD_TESTING)
|
||||||
|
add_executable(stop_all_admission_gate_test
|
||||||
|
stop_all/tests/stop_all_admission_gate_test.cpp
|
||||||
|
stop_all/src/stop_all_admission_gate.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(stop_all_admission_gate_test
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
|
)
|
||||||
|
target_link_libraries(stop_all_admission_gate_test PRIVATE
|
||||||
|
gtest
|
||||||
|
gtest_main
|
||||||
|
pthread
|
||||||
|
)
|
||||||
|
add_test(
|
||||||
|
NAME stop_all_admission_gate_test
|
||||||
|
COMMAND stop_all_admission_gate_test
|
||||||
|
)
|
||||||
|
set_tests_properties(stop_all_admission_gate_test PROPERTIES TIMEOUT 10)
|
||||||
|
|
||||||
|
add_executable(stop_operation_dispatcher_test
|
||||||
|
stop_all/tests/stop_operation_dispatcher_test.cpp
|
||||||
|
stop_all/src/stop_operation_dispatcher.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(stop_operation_dispatcher_test
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
|
)
|
||||||
|
target_link_libraries(stop_operation_dispatcher_test PRIVATE
|
||||||
|
gtest
|
||||||
|
gtest_main
|
||||||
|
pthread
|
||||||
|
)
|
||||||
|
add_test(
|
||||||
|
NAME stop_operation_dispatcher_test
|
||||||
|
COMMAND stop_operation_dispatcher_test
|
||||||
|
)
|
||||||
|
set_tests_properties(stop_operation_dispatcher_test PROPERTIES TIMEOUT 10)
|
||||||
|
|
||||||
|
add_executable(camera_operational_activity_registry_test
|
||||||
|
server/tests/camera_operational_activity_registry_test.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(camera_operational_activity_registry_test
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
|
)
|
||||||
|
target_link_libraries(camera_operational_activity_registry_test PRIVATE
|
||||||
|
cmvr_es::proto
|
||||||
|
cmvr_es::camera_operational_activity_registry
|
||||||
|
gtest
|
||||||
|
gtest_main
|
||||||
|
pthread
|
||||||
|
)
|
||||||
|
add_test(
|
||||||
|
NAME camera_operational_activity_registry_test
|
||||||
|
COMMAND camera_operational_activity_registry_test
|
||||||
|
)
|
||||||
|
set_tests_properties(camera_operational_activity_registry_test PROPERTIES
|
||||||
|
TIMEOUT 10)
|
||||||
|
|
||||||
|
add_executable(camera_ptz_activity_registry_test
|
||||||
|
server/tests/camera_ptz_activity_registry_test.cpp
|
||||||
|
server/src/camera_ptz_activity_registry.cpp
|
||||||
|
stop_all/src/stop_all_admission_gate.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(camera_ptz_activity_registry_test
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
|
)
|
||||||
|
target_link_libraries(camera_ptz_activity_registry_test PRIVATE
|
||||||
|
cmvr_es::proto
|
||||||
|
gtest
|
||||||
|
gtest_main
|
||||||
|
pthread
|
||||||
|
)
|
||||||
|
add_test(
|
||||||
|
NAME camera_ptz_activity_registry_test
|
||||||
|
COMMAND camera_ptz_activity_registry_test
|
||||||
|
)
|
||||||
|
set_tests_properties(camera_ptz_activity_registry_test PROPERTIES TIMEOUT 10)
|
||||||
|
|
||||||
|
add_executable(media_activity_coordinator_test
|
||||||
|
server/tests/media_activity_coordinator_test.cpp
|
||||||
|
server/src/media_activity_coordinator.cpp
|
||||||
|
stop_all/src/stop_all_admission_gate.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(media_activity_coordinator_test
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
|
)
|
||||||
|
target_link_libraries(media_activity_coordinator_test PRIVATE
|
||||||
|
cmvr_es::logging
|
||||||
|
pthread
|
||||||
|
)
|
||||||
|
add_test(
|
||||||
|
NAME media_activity_coordinator_test
|
||||||
|
COMMAND media_activity_coordinator_test
|
||||||
|
)
|
||||||
|
set(_grpc_media_test_environment
|
||||||
|
"LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}"
|
||||||
|
)
|
||||||
|
if(CMVR_TEST_SYSTEM_LIBSTDCXX)
|
||||||
|
list(APPEND _grpc_media_test_environment
|
||||||
|
"LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}")
|
||||||
|
endif()
|
||||||
|
set_tests_properties(media_activity_coordinator_test PROPERTIES
|
||||||
|
TIMEOUT 10
|
||||||
|
ENVIRONMENT "${_grpc_media_test_environment}"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(motor_activity_coordinator_test
|
||||||
|
server/tests/motor_activity_coordinator_test.cpp
|
||||||
|
server/src/motor_activity_coordinator.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(motor_activity_coordinator_test
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
|
)
|
||||||
|
target_link_libraries(motor_activity_coordinator_test PRIVATE
|
||||||
|
cmvr_es::logging
|
||||||
|
pthread
|
||||||
|
)
|
||||||
|
add_test(
|
||||||
|
NAME motor_activity_coordinator_test
|
||||||
|
COMMAND motor_activity_coordinator_test
|
||||||
|
)
|
||||||
|
set_tests_properties(motor_activity_coordinator_test PROPERTIES
|
||||||
|
TIMEOUT 10
|
||||||
|
ENVIRONMENT "${_grpc_media_test_environment}"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(grpc_camera_stream_policy_test
|
||||||
|
server/tests/grpc_camera_stream_policy_test.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(grpc_camera_stream_policy_test
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
|
)
|
||||||
|
add_test(
|
||||||
|
NAME grpc_camera_stream_policy_test
|
||||||
|
COMMAND grpc_camera_stream_policy_test
|
||||||
|
)
|
||||||
|
set_tests_properties(grpc_camera_stream_policy_test PROPERTIES TIMEOUT 10)
|
||||||
|
|
||||||
|
add_executable(grpc_system_service_test
|
||||||
|
server/tests/grpc_system_service_test.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(grpc_system_service_test
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es/manager/device_manager
|
||||||
|
)
|
||||||
|
target_link_libraries(grpc_system_service_test
|
||||||
|
PRIVATE
|
||||||
|
service
|
||||||
|
cmvr_es::proto
|
||||||
|
gtest
|
||||||
|
gtest_main
|
||||||
|
pthread
|
||||||
|
)
|
||||||
|
add_test(
|
||||||
|
NAME grpc_system_service_test
|
||||||
|
COMMAND grpc_system_service_test
|
||||||
|
)
|
||||||
|
set(_grpc_system_test_environment
|
||||||
|
"LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}"
|
||||||
|
)
|
||||||
|
if(CMVR_TEST_SYSTEM_LIBSTDCXX)
|
||||||
|
list(APPEND _grpc_system_test_environment
|
||||||
|
"LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}")
|
||||||
|
endif()
|
||||||
|
set_tests_properties(grpc_system_service_test PROPERTIES
|
||||||
|
TIMEOUT 10
|
||||||
|
ENVIRONMENT "${_grpc_system_test_environment}"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(grpc_error_logging_interceptor_test
|
||||||
|
server/tests/grpc_error_logging_interceptor_test.cpp
|
||||||
|
server/src/grpc_error_logging_interceptor.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(grpc_error_logging_interceptor_test
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
|
)
|
||||||
|
target_link_libraries(grpc_error_logging_interceptor_test
|
||||||
|
PRIVATE
|
||||||
|
cmvr_es::logging
|
||||||
|
cmvr_es::proto
|
||||||
|
gtest
|
||||||
|
gtest_main
|
||||||
|
pthread
|
||||||
|
)
|
||||||
|
add_test(
|
||||||
|
NAME grpc_error_logging_interceptor_test
|
||||||
|
COMMAND grpc_error_logging_interceptor_test
|
||||||
|
)
|
||||||
|
set_tests_properties(grpc_error_logging_interceptor_test PROPERTIES
|
||||||
|
TIMEOUT 10
|
||||||
|
ENVIRONMENT "${_grpc_system_test_environment}"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(grpc_security_test
|
||||||
|
server/tests/grpc_security_test.cpp
|
||||||
|
server/src/grpc_security.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(grpc_security_test
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
|
)
|
||||||
|
target_link_libraries(grpc_security_test
|
||||||
|
PRIVATE
|
||||||
|
cmvr_es::proto
|
||||||
|
gtest
|
||||||
|
gtest_main
|
||||||
|
pthread
|
||||||
|
)
|
||||||
|
add_test(
|
||||||
|
NAME grpc_security_test
|
||||||
|
COMMAND grpc_security_test
|
||||||
|
)
|
||||||
|
set_tests_properties(grpc_security_test PROPERTIES
|
||||||
|
TIMEOUT 10
|
||||||
|
ENVIRONMENT "${_grpc_system_test_environment}"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(grpc_command_transaction_test
|
||||||
|
server/tests/grpc_command_transaction_test.cpp
|
||||||
|
server/src/grpc_command_transaction.cpp
|
||||||
|
server/src/grpc_safety_proto.cpp
|
||||||
|
server/src/grpc_security.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(grpc_command_transaction_test
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
|
)
|
||||||
|
target_link_libraries(grpc_command_transaction_test PRIVATE
|
||||||
|
cmvr_es::safety_manager
|
||||||
|
cmvr_es::proto
|
||||||
|
gtest
|
||||||
|
gtest_main
|
||||||
|
pthread
|
||||||
|
)
|
||||||
|
add_test(
|
||||||
|
NAME grpc_command_transaction_test
|
||||||
|
COMMAND grpc_command_transaction_test
|
||||||
|
)
|
||||||
|
set_tests_properties(grpc_command_transaction_test PROPERTIES
|
||||||
|
TIMEOUT 10
|
||||||
|
ENVIRONMENT "${_grpc_system_test_environment}"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(grpc_arm_service_test
|
||||||
|
server/tests/grpc_arm_service_test.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(grpc_arm_service_test
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es/manager/device_manager
|
||||||
|
)
|
||||||
|
target_link_libraries(grpc_arm_service_test
|
||||||
|
PRIVATE
|
||||||
|
service
|
||||||
|
cmvr_es::proto
|
||||||
|
gtest
|
||||||
|
gtest_main
|
||||||
|
pthread
|
||||||
|
)
|
||||||
|
add_test(
|
||||||
|
NAME grpc_arm_service_test
|
||||||
|
COMMAND grpc_arm_service_test
|
||||||
|
)
|
||||||
|
set_tests_properties(grpc_arm_service_test PROPERTIES
|
||||||
|
TIMEOUT 10
|
||||||
|
ENVIRONMENT "${_grpc_system_test_environment}"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(grpc_arm_teleop_service_test
|
||||||
|
server/tests/grpc_arm_teleop_service_test.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(grpc_arm_teleop_service_test
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
|
)
|
||||||
|
target_link_libraries(grpc_arm_teleop_service_test
|
||||||
|
PRIVATE
|
||||||
|
service
|
||||||
|
cmvr_es::proto
|
||||||
|
gtest
|
||||||
|
gtest_main
|
||||||
|
pthread
|
||||||
|
)
|
||||||
|
add_test(
|
||||||
|
NAME grpc_arm_teleop_service_test
|
||||||
|
COMMAND grpc_arm_teleop_service_test
|
||||||
|
)
|
||||||
|
set(_grpc_arm_teleop_test_environment
|
||||||
|
"LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}"
|
||||||
|
)
|
||||||
|
if(CMVR_TEST_SYSTEM_LIBSTDCXX)
|
||||||
|
list(APPEND _grpc_arm_teleop_test_environment
|
||||||
|
"LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}")
|
||||||
|
endif()
|
||||||
|
set_tests_properties(grpc_arm_teleop_service_test PROPERTIES
|
||||||
|
TIMEOUT 20
|
||||||
|
ENVIRONMENT "${_grpc_arm_teleop_test_environment}"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(grpc_robot_arm_teleop_backend_test
|
||||||
|
server/tests/grpc_robot_arm_teleop_backend_test.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(grpc_robot_arm_teleop_backend_test
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
|
)
|
||||||
|
target_link_libraries(grpc_robot_arm_teleop_backend_test
|
||||||
|
PRIVATE
|
||||||
|
service
|
||||||
|
cmvr_es::proto
|
||||||
|
gtest
|
||||||
|
gtest_main
|
||||||
|
pthread
|
||||||
|
)
|
||||||
|
add_test(
|
||||||
|
NAME grpc_robot_arm_teleop_backend_test
|
||||||
|
COMMAND grpc_robot_arm_teleop_backend_test
|
||||||
|
)
|
||||||
|
set_tests_properties(grpc_robot_arm_teleop_backend_test PROPERTIES
|
||||||
|
TIMEOUT 10
|
||||||
|
ENVIRONMENT "${_grpc_arm_teleop_test_environment}"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(grpc_motor_service_test
|
||||||
|
server/tests/grpc_motor_service_test.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(grpc_motor_service_test
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es/manager/device_manager
|
||||||
|
)
|
||||||
|
target_link_libraries(grpc_motor_service_test
|
||||||
|
PRIVATE
|
||||||
|
service
|
||||||
|
gtest
|
||||||
|
gtest_main
|
||||||
|
pthread
|
||||||
|
)
|
||||||
|
add_test(
|
||||||
|
NAME grpc_motor_service_test
|
||||||
|
COMMAND grpc_motor_service_test
|
||||||
|
)
|
||||||
|
set(_grpc_motor_test_environment
|
||||||
|
"LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}"
|
||||||
|
)
|
||||||
|
if(CMVR_TEST_SYSTEM_LIBSTDCXX)
|
||||||
|
list(APPEND _grpc_motor_test_environment
|
||||||
|
"LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}")
|
||||||
|
endif()
|
||||||
|
set_tests_properties(grpc_motor_service_test PROPERTIES
|
||||||
|
TIMEOUT 10
|
||||||
|
ENVIRONMENT "${_grpc_motor_test_environment}"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(grpc_agv_service_test
|
||||||
|
server/tests/grpc_agv_service_test.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(grpc_agv_service_test
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es/manager/device_manager
|
||||||
|
)
|
||||||
|
target_link_libraries(grpc_agv_service_test
|
||||||
|
PRIVATE
|
||||||
|
service
|
||||||
|
gtest
|
||||||
|
gtest_main
|
||||||
|
pthread
|
||||||
|
)
|
||||||
|
add_test(
|
||||||
|
NAME grpc_agv_service_test
|
||||||
|
COMMAND grpc_agv_service_test
|
||||||
|
)
|
||||||
|
set(_grpc_agv_test_environment
|
||||||
|
"LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}"
|
||||||
|
)
|
||||||
|
if(CMVR_TEST_SYSTEM_LIBSTDCXX)
|
||||||
|
list(APPEND _grpc_agv_test_environment
|
||||||
|
"LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}")
|
||||||
|
endif()
|
||||||
|
set_tests_properties(grpc_agv_service_test PROPERTIES
|
||||||
|
TIMEOUT 10
|
||||||
|
ENVIRONMENT "${_grpc_agv_test_environment}"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(grpc_head_service_test
|
||||||
|
server/tests/grpc_head_service_test.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(grpc_head_service_test
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es/manager/device_manager
|
||||||
|
)
|
||||||
|
target_link_libraries(grpc_head_service_test
|
||||||
|
PRIVATE
|
||||||
|
service
|
||||||
|
cmvr_es::proto
|
||||||
|
gtest
|
||||||
|
gtest_main
|
||||||
|
pthread
|
||||||
|
)
|
||||||
|
add_test(
|
||||||
|
NAME grpc_head_service_test
|
||||||
|
COMMAND grpc_head_service_test
|
||||||
|
)
|
||||||
|
set_tests_properties(grpc_head_service_test PROPERTIES
|
||||||
|
TIMEOUT 15
|
||||||
|
ENVIRONMENT "${_grpc_system_test_environment}"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(grpc_dexhand_service_test
|
||||||
|
server/tests/grpc_dexhand_service_test.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(grpc_dexhand_service_test
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es
|
||||||
|
${CMAKE_SOURCE_DIR}/cmvr-es/manager/device_manager
|
||||||
|
)
|
||||||
|
target_link_libraries(grpc_dexhand_service_test
|
||||||
|
PRIVATE
|
||||||
|
service
|
||||||
|
cmvr_es::proto
|
||||||
|
gtest
|
||||||
|
gtest_main
|
||||||
|
pthread
|
||||||
|
)
|
||||||
|
add_test(
|
||||||
|
NAME grpc_dexhand_service_test
|
||||||
|
COMMAND grpc_dexhand_service_test
|
||||||
|
)
|
||||||
|
set_tests_properties(grpc_dexhand_service_test PROPERTIES
|
||||||
|
TIMEOUT 15
|
||||||
|
ENVIRONMENT "${_grpc_system_test_environment}"
|
||||||
|
)
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# --------------------------------------------------------
|
||||||
|
# Unit test
|
||||||
|
# --------------------------------------------------------
|
||||||
|
find_package(OpenCV REQUIRED)
|
||||||
|
|
||||||
|
include_directories(
|
||||||
|
${CMAKE_SOURCE_DIR}/third_party/gtest/1.17.0/include
|
||||||
|
)
|
||||||
|
|
||||||
|
link_directories(
|
||||||
|
${CMAKE_SOURCE_DIR}/third_party/gtest/1.17.0/lib
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
add_executable(grpc_arm_client_test
|
||||||
|
server/tests/grpc_arm_client_test.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
target_link_libraries(grpc_arm_client_test
|
||||||
|
PRIVATE
|
||||||
|
cmvr_es::device::canbus
|
||||||
|
cmvr_es::device::ti5_canopen_motor_driver
|
||||||
|
osqp
|
||||||
|
gtest
|
||||||
|
gtest_main
|
||||||
|
pthread
|
||||||
|
glog
|
||||||
|
cmvr_es::proto
|
||||||
|
ccd
|
||||||
|
fcl
|
||||||
|
cmvr_es::device_manager
|
||||||
|
${OpenCV_LIBS}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
add_executable(grpc_hlc_client_test
|
||||||
|
server/tests/grpc_hlc_client_test.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
target_link_libraries(grpc_hlc_client_test
|
||||||
|
PRIVATE
|
||||||
|
cmvr_es::device::canbus
|
||||||
|
cmvr_es::device::ti5_canopen_motor_driver
|
||||||
|
osqp
|
||||||
|
gtest
|
||||||
|
gtest_main
|
||||||
|
pthread
|
||||||
|
glog
|
||||||
|
cmvr_es::proto
|
||||||
|
ccd
|
||||||
|
fcl
|
||||||
|
cmvr_es::device_manager
|
||||||
|
)
|
||||||
@ -9,7 +9,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "cmvr/api/system_command.pb.h"
|
#include "cmvr/api/system_command.pb.h"
|
||||||
#include "manager/safety/include/safety_types.h"
|
#include "manager/safety_manager/include/safety_types.h"
|
||||||
|
|
||||||
namespace cmvr::device {
|
namespace cmvr::device {
|
||||||
class DeviceManager;
|
class DeviceManager;
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/action/include/action_queue_executor.h"
|
#include "service/grpc/action/include/action_queue_executor.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <array>
|
#include <array>
|
||||||
@ -36,10 +36,10 @@
|
|||||||
#include "common/base/logging/logger.h"
|
#include "common/base/logging/logger.h"
|
||||||
#include "devices/agv/abstract_agv.h"
|
#include "devices/agv/abstract_agv.h"
|
||||||
#include "devices/arm/robot_arm.h"
|
#include "devices/arm/robot_arm.h"
|
||||||
#include "manager/control_authority/include/control_authority_manager.h"
|
#include "manager/control_authority_manager/include/control_authority_manager.h"
|
||||||
#include "manager/device_manager/include/device_manager.h"
|
#include "manager/device_manager/include/device_manager.h"
|
||||||
#include "manager/safety/include/safety_coordinator.h"
|
#include "manager/safety_manager/include/safety_manager.h"
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
namespace {
|
namespace {
|
||||||
@ -1965,7 +1965,7 @@ struct ActionQueueExecutor::Impl {
|
|||||||
}
|
}
|
||||||
request.authority_generation = token.generation;
|
request.authority_generation = token.generation;
|
||||||
request.deadline = deadline;
|
request.deadline = deadline;
|
||||||
return device_manager.safetyCoordinator().admit(request);
|
return device_manager.safetyManager().admit(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string admissionFailure(
|
static std::string admissionFailure(
|
||||||
@ -2010,7 +2010,7 @@ struct ActionQueueExecutor::Impl {
|
|||||||
StepOutcome::Canceled,
|
StepOutcome::Canceled,
|
||||||
"RobotArm ActionQueue control was preempted before dispatch"};
|
"RobotArm ActionQueue control was preempted before dispatch"};
|
||||||
}
|
}
|
||||||
auto safety_dispatch = device_manager.safetyCoordinator()
|
auto safety_dispatch = device_manager.safetyManager()
|
||||||
.beginDispatch(*safety_admission.permit);
|
.beginDispatch(*safety_admission.permit);
|
||||||
if (!safety_dispatch.acquired()) {
|
if (!safety_dispatch.acquired()) {
|
||||||
return {
|
return {
|
||||||
@ -2171,7 +2171,7 @@ struct ActionQueueExecutor::Impl {
|
|||||||
StepOutcome::Canceled,
|
StepOutcome::Canceled,
|
||||||
"AGV ActionQueue control was preempted before dispatch"};
|
"AGV ActionQueue control was preempted before dispatch"};
|
||||||
}
|
}
|
||||||
auto safety_dispatch = device_manager.safetyCoordinator()
|
auto safety_dispatch = device_manager.safetyManager()
|
||||||
.beginDispatch(*safety_admission.permit);
|
.beginDispatch(*safety_admission.permit);
|
||||||
if (!safety_dispatch.acquired()) {
|
if (!safety_dispatch.acquired()) {
|
||||||
return {
|
return {
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/arm_teleop_client/include/grpc_arm_teleop_client.h"
|
#include "service/grpc/client/include/grpc_arm_teleop_client.h"
|
||||||
|
|
||||||
#include <exception>
|
#include <exception>
|
||||||
#include <string>
|
#include <string>
|
||||||
@ -12,7 +12,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "cmvr/api/arm_teleop_v1.grpc.pb.h"
|
#include "cmvr/api/arm_teleop_v1.grpc.pb.h"
|
||||||
#include "service/arm_teleop_client/include/grpc_arm_teleop_client.h"
|
#include "service/grpc/client/include/grpc_arm_teleop_client.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
@ -9,7 +9,7 @@
|
|||||||
#include <grpcpp/grpcpp.h>
|
#include <grpcpp/grpcpp.h>
|
||||||
|
|
||||||
#include "cmvr/api/arm_teleop_v1.grpc.pb.h"
|
#include "cmvr/api/arm_teleop_v1.grpc.pb.h"
|
||||||
#include "manager/control_authority/include/control_authority_manager.h"
|
#include "manager/control_authority_manager/include/control_authority_manager.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
|
|
||||||
@ -18,7 +18,7 @@ class GrpcSecurityGateway;
|
|||||||
} // namespace cmvr::service
|
} // namespace cmvr::service
|
||||||
|
|
||||||
namespace cmvr::safety {
|
namespace cmvr::safety {
|
||||||
class SafetyCoordinator;
|
class SafetyManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
@ -87,7 +87,7 @@ public:
|
|||||||
makeDisabledArmTeleopBackend(),
|
makeDisabledArmTeleopBackend(),
|
||||||
control::ControlAuthorityManager* authority = nullptr,
|
control::ControlAuthorityManager* authority = nullptr,
|
||||||
std::shared_ptr<GrpcSecurityGateway> security_gateway = nullptr,
|
std::shared_ptr<GrpcSecurityGateway> security_gateway = nullptr,
|
||||||
safety::SafetyCoordinator* safety_coordinator = nullptr);
|
safety::SafetyManager* safety_manager = nullptr);
|
||||||
~ArmTeleopServiceImpl() override = default;
|
~ArmTeleopServiceImpl() override = default;
|
||||||
|
|
||||||
grpc::Status Teleoperate(
|
grpc::Status Teleoperate(
|
||||||
@ -99,7 +99,7 @@ private:
|
|||||||
std::shared_ptr<ArmTeleopBackend> backend_;
|
std::shared_ptr<ArmTeleopBackend> backend_;
|
||||||
control::ControlAuthorityManager* authority_{nullptr};
|
control::ControlAuthorityManager* authority_{nullptr};
|
||||||
std::shared_ptr<GrpcSecurityGateway> security_gateway_;
|
std::shared_ptr<GrpcSecurityGateway> security_gateway_;
|
||||||
safety::SafetyCoordinator* safety_coordinator_{nullptr};
|
safety::SafetyManager* safety_manager_{nullptr};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace cmvr::service
|
} // namespace cmvr::service
|
||||||
@ -11,7 +11,7 @@
|
|||||||
#include "common/base/grpc_utils.h"
|
#include "common/base/grpc_utils.h"
|
||||||
#include "manager/device_manager/include/device_manager.h"
|
#include "manager/device_manager/include/device_manager.h"
|
||||||
#include "devices/camera/abstract_camera.h"
|
#include "devices/camera/abstract_camera.h"
|
||||||
#include "service/grpc/include/grpc_camera_stream_policy.h"
|
#include "service/grpc/server/include/grpc_camera_stream_policy.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
|
|
||||||
@ -11,8 +11,8 @@
|
|||||||
#include <google/protobuf/message.h>
|
#include <google/protobuf/message.h>
|
||||||
|
|
||||||
#include "cmvr/api/common.pb.h"
|
#include "cmvr/api/common.pb.h"
|
||||||
#include "manager/safety/include/safety_coordinator.h"
|
#include "manager/safety_manager/include/safety_manager.h"
|
||||||
#include "service/grpc/include/grpc_security.h"
|
#include "service/grpc/server/include/grpc_security.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ struct GrpcStreamingSafetyOpen {
|
|||||||
class GrpcStreamingSafetySession final {
|
class GrpcStreamingSafetySession final {
|
||||||
public:
|
public:
|
||||||
GrpcStreamingSafetySession(
|
GrpcStreamingSafetySession(
|
||||||
safety::SafetyCoordinator& coordinator,
|
safety::SafetyManager& coordinator,
|
||||||
const GrpcRequestContext& request_context,
|
const GrpcRequestContext& request_context,
|
||||||
GrpcStreamingSafetyOpen open);
|
GrpcStreamingSafetyOpen open);
|
||||||
|
|
||||||
@ -67,7 +67,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
void reject_(safety::SafetyReason reason, std::string detail);
|
void reject_(safety::SafetyReason reason, std::string detail);
|
||||||
|
|
||||||
safety::SafetyCoordinator* coordinator_{nullptr};
|
safety::SafetyManager* coordinator_{nullptr};
|
||||||
std::optional<safety::AdmissionPermit> permit_;
|
std::optional<safety::AdmissionPermit> permit_;
|
||||||
safety::AdmissionDecision admission_decision_;
|
safety::AdmissionDecision admission_decision_;
|
||||||
grpc::Status status_;
|
grpc::Status status_;
|
||||||
@ -79,7 +79,7 @@ private:
|
|||||||
class GrpcCommandTransaction final {
|
class GrpcCommandTransaction final {
|
||||||
public:
|
public:
|
||||||
GrpcCommandTransaction(
|
GrpcCommandTransaction(
|
||||||
safety::SafetyCoordinator& coordinator,
|
safety::SafetyManager& coordinator,
|
||||||
GrpcRequestContext request_context,
|
GrpcRequestContext request_context,
|
||||||
GrpcMethodPolicy method_policy,
|
GrpcMethodPolicy method_policy,
|
||||||
const google::protobuf::Message& request,
|
const google::protobuf::Message& request,
|
||||||
@ -153,7 +153,7 @@ private:
|
|||||||
const std::string& detail);
|
const std::string& detail);
|
||||||
void abandon_() noexcept;
|
void abandon_() noexcept;
|
||||||
|
|
||||||
safety::SafetyCoordinator* coordinator_{nullptr};
|
safety::SafetyManager* coordinator_{nullptr};
|
||||||
GrpcRequestContext request_context_;
|
GrpcRequestContext request_context_;
|
||||||
GrpcMethodPolicy method_policy_;
|
GrpcMethodPolicy method_policy_;
|
||||||
google::protobuf::Message* response_{nullptr};
|
google::protobuf::Message* response_{nullptr};
|
||||||
@ -181,7 +181,7 @@ using GrpcUnaryCommandOperation =
|
|||||||
grpc::Status executeRegisteredGrpcCommand(
|
grpc::Status executeRegisteredGrpcCommand(
|
||||||
const std::shared_ptr<GrpcSecurityGateway>& gateway,
|
const std::shared_ptr<GrpcSecurityGateway>& gateway,
|
||||||
grpc::ServerContext* server_context,
|
grpc::ServerContext* server_context,
|
||||||
safety::SafetyCoordinator& coordinator,
|
safety::SafetyManager& coordinator,
|
||||||
const std::string& full_method_name,
|
const std::string& full_method_name,
|
||||||
const google::protobuf::Message* request,
|
const google::protobuf::Message* request,
|
||||||
google::protobuf::Message* response,
|
google::protobuf::Message* response,
|
||||||
@ -194,7 +194,7 @@ grpc::Status executeRegisteredGrpcCommand(
|
|||||||
grpc::Status executeServerDerivedGrpcCommand(
|
grpc::Status executeServerDerivedGrpcCommand(
|
||||||
const std::shared_ptr<GrpcSecurityGateway>& gateway,
|
const std::shared_ptr<GrpcSecurityGateway>& gateway,
|
||||||
grpc::ServerContext* server_context,
|
grpc::ServerContext* server_context,
|
||||||
safety::SafetyCoordinator& coordinator,
|
safety::SafetyManager& coordinator,
|
||||||
const std::string& full_method_name,
|
const std::string& full_method_name,
|
||||||
GrpcMethodPolicy effective_policy,
|
GrpcMethodPolicy effective_policy,
|
||||||
const google::protobuf::Message* request,
|
const google::protobuf::Message* request,
|
||||||
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
#include "cmvr/api/motor_service.grpc.pb.h"
|
#include "cmvr/api/motor_service.grpc.pb.h"
|
||||||
#include "devices/motor/abstract_motor.h"
|
#include "devices/motor/abstract_motor.h"
|
||||||
#include "service/grpc/include/motor_activity_coordinator.h"
|
#include "service/grpc/server/include/motor_activity_coordinator.h"
|
||||||
|
|
||||||
namespace cmvr::device {
|
namespace cmvr::device {
|
||||||
class DeviceManager;
|
class DeviceManager;
|
||||||
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
#include "cmvr/config/grpc_server_config/grpc_server_config.pb.h"
|
#include "cmvr/config/grpc_server_config/grpc_server_config.pb.h"
|
||||||
#include "devices/arm/robot_arm.h"
|
#include "devices/arm/robot_arm.h"
|
||||||
#include "service/grpc/include/grpc_arm_teleop_service.h"
|
#include "service/grpc/server/include/grpc_arm_teleop_service.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
|
|
||||||
@ -3,7 +3,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace cmvr::safety {
|
namespace cmvr::safety {
|
||||||
class SafetyCoordinator;
|
class SafetyManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
@ -26,7 +26,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
friend std::unique_ptr<GrpcSafetyParticipantRegistration>
|
friend std::unique_ptr<GrpcSafetyParticipantRegistration>
|
||||||
registerGrpcSafetyParticipants(
|
registerGrpcSafetyParticipants(
|
||||||
safety::SafetyCoordinator&,
|
safety::SafetyManager&,
|
||||||
std::shared_ptr<ActionQueueExecutor>,
|
std::shared_ptr<ActionQueueExecutor>,
|
||||||
std::shared_ptr<StopOperationDispatcher>);
|
std::shared_ptr<StopOperationDispatcher>);
|
||||||
struct Impl;
|
struct Impl;
|
||||||
@ -36,7 +36,7 @@ private:
|
|||||||
|
|
||||||
std::unique_ptr<GrpcSafetyParticipantRegistration>
|
std::unique_ptr<GrpcSafetyParticipantRegistration>
|
||||||
registerGrpcSafetyParticipants(
|
registerGrpcSafetyParticipants(
|
||||||
safety::SafetyCoordinator& coordinator,
|
safety::SafetyManager& coordinator,
|
||||||
std::shared_ptr<ActionQueueExecutor> action_queue,
|
std::shared_ptr<ActionQueueExecutor> action_queue,
|
||||||
std::shared_ptr<StopOperationDispatcher> stop_dispatcher);
|
std::shared_ptr<StopOperationDispatcher> stop_dispatcher);
|
||||||
|
|
||||||
@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "cmvr/api/safety_command.pb.h"
|
#include "cmvr/api/safety_command.pb.h"
|
||||||
#include "manager/safety/include/safety_coordinator.h"
|
#include "manager/safety_manager/include/safety_manager.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
|
|
||||||
@ -13,7 +13,7 @@
|
|||||||
#include <grpcpp/support/status.h>
|
#include <grpcpp/support/status.h>
|
||||||
|
|
||||||
#include "cmvr/config/grpc_server_config/grpc_server_config.pb.h"
|
#include "cmvr/config/grpc_server_config/grpc_server_config.pb.h"
|
||||||
#include "manager/safety/include/safety_types.h"
|
#include "manager/safety_manager/include/safety_types.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
|
|
||||||
@ -8,7 +8,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "service/stop_all/include/deferred_stop_operation.h"
|
#include "service/grpc/stop_all/include/deferred_stop_operation.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
|
|
||||||
@ -9,7 +9,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "service/stop_all/include/deferred_stop_operation.h"
|
#include "service/grpc/stop_all/include/deferred_stop_operation.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
|
|
||||||
@ -1,9 +1,9 @@
|
|||||||
#include "service/grpc/include/camera_operational_activity_registry.h"
|
#include "service/grpc/server/include/camera_operational_activity_registry.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <exception>
|
#include <exception>
|
||||||
|
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
namespace {
|
namespace {
|
||||||
@ -1,10 +1,10 @@
|
|||||||
#include "service/grpc/include/camera_ptz_activity_registry.h"
|
#include "service/grpc/server/include/camera_ptz_activity_registry.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <exception>
|
#include <exception>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/grpc/include/grpc_agv_service.h"
|
#include "service/grpc/server/include/grpc_agv_service.h"
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@ -11,10 +11,10 @@
|
|||||||
#include <google/protobuf/util/time_util.h>
|
#include <google/protobuf/util/time_util.h>
|
||||||
|
|
||||||
#include "common/base/logging/logger.h"
|
#include "common/base/logging/logger.h"
|
||||||
#include "manager/control_authority/include/control_authority_manager.h"
|
#include "manager/control_authority_manager/include/control_authority_manager.h"
|
||||||
#include "service/grpc/include/grpc_command_transaction.h"
|
#include "service/grpc/server/include/grpc_command_transaction.h"
|
||||||
#include "service/grpc/include/grpc_security.h"
|
#include "service/grpc/server/include/grpc_security.h"
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
|
|
||||||
using google::protobuf::util::TimeUtil;
|
using google::protobuf::util::TimeUtil;
|
||||||
|
|
||||||
@ -668,7 +668,7 @@ grpc::Status gRPCAgvServiceImpl::emergencyStop(grpc::ServerContext* context,
|
|||||||
api::CommandHeader_Feedback* response)
|
api::CommandHeader_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.AgvService/emergencyStop", request, response,
|
"/cmvr.api.AgvService/emergencyStop", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->device_id();
|
const std::string device_id = request->device_id();
|
||||||
@ -696,7 +696,7 @@ grpc::Status gRPCAgvServiceImpl::clearFault(grpc::ServerContext* context,
|
|||||||
api::CommandHeader_Feedback* response)
|
api::CommandHeader_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.AgvService/clearFault", request, response,
|
"/cmvr.api.AgvService/clearFault", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->device_id();
|
const std::string device_id = request->device_id();
|
||||||
@ -727,7 +727,7 @@ grpc::Status gRPCAgvServiceImpl::navigateToPose(grpc::ServerContext* context,
|
|||||||
api::AgvNavigateToPoseCommand_Feedback* response)
|
api::AgvNavigateToPoseCommand_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.AgvService/navigateToPose", request, response,
|
"/cmvr.api.AgvService/navigateToPose", request, response,
|
||||||
[this, context, request, response](GrpcCommandTransaction& command) {
|
[this, context, request, response](GrpcCommandTransaction& command) {
|
||||||
if (context && context->IsCancelled()) {
|
if (context && context->IsCancelled()) {
|
||||||
@ -766,7 +766,7 @@ grpc::Status gRPCAgvServiceImpl::navigateToStation(grpc::ServerContext* context,
|
|||||||
api::AgvNavigateToStationCommand_Feedback* response)
|
api::AgvNavigateToStationCommand_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.AgvService/navigateToStation", request, response,
|
"/cmvr.api.AgvService/navigateToStation", request, response,
|
||||||
[this, context, request, response](GrpcCommandTransaction& command) {
|
[this, context, request, response](GrpcCommandTransaction& command) {
|
||||||
if (context && context->IsCancelled()) {
|
if (context && context->IsCancelled()) {
|
||||||
@ -806,7 +806,7 @@ grpc::Status gRPCAgvServiceImpl::followPath(grpc::ServerContext* context,
|
|||||||
api::AgvFollowPathCommand_Feedback* response)
|
api::AgvFollowPathCommand_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.AgvService/followPath", request, response,
|
"/cmvr.api.AgvService/followPath", request, response,
|
||||||
[this, context, request, response](GrpcCommandTransaction& command) {
|
[this, context, request, response](GrpcCommandTransaction& command) {
|
||||||
if (context && context->IsCancelled()) {
|
if (context && context->IsCancelled()) {
|
||||||
@ -854,7 +854,7 @@ grpc::Status gRPCAgvServiceImpl::translate(
|
|||||||
api::AgvTranslateCommand_Feedback* response)
|
api::AgvTranslateCommand_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.AgvService/translate", request, response,
|
"/cmvr.api.AgvService/translate", request, response,
|
||||||
[this, context, request, response](GrpcCommandTransaction& command) {
|
[this, context, request, response](GrpcCommandTransaction& command) {
|
||||||
if (context && context->IsCancelled()) {
|
if (context && context->IsCancelled()) {
|
||||||
@ -892,7 +892,7 @@ grpc::Status gRPCAgvServiceImpl::pauseNavigation(grpc::ServerContext* context,
|
|||||||
api::CommandHeader_Feedback* response)
|
api::CommandHeader_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.AgvService/pauseNavigation", request, response,
|
"/cmvr.api.AgvService/pauseNavigation", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->device_id();
|
const std::string device_id = request->device_id();
|
||||||
@ -924,7 +924,7 @@ grpc::Status gRPCAgvServiceImpl::resumeNavigation(grpc::ServerContext* context,
|
|||||||
api::CommandHeader_Feedback* response)
|
api::CommandHeader_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.AgvService/resumeNavigation", request, response,
|
"/cmvr.api.AgvService/resumeNavigation", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->device_id();
|
const std::string device_id = request->device_id();
|
||||||
@ -956,7 +956,7 @@ grpc::Status gRPCAgvServiceImpl::cancelNavigation(grpc::ServerContext* context,
|
|||||||
api::CommandHeader_Feedback* response)
|
api::CommandHeader_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.AgvService/cancelNavigation", request, response,
|
"/cmvr.api.AgvService/cancelNavigation", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->device_id();
|
const std::string device_id = request->device_id();
|
||||||
@ -984,7 +984,7 @@ grpc::Status gRPCAgvServiceImpl::setVelocity(grpc::ServerContext* context,
|
|||||||
api::AgvSetVelocityCommand_Feedback* response)
|
api::AgvSetVelocityCommand_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.AgvService/setVelocity", request, response,
|
"/cmvr.api.AgvService/setVelocity", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->header().device_id();
|
const std::string device_id = request->header().device_id();
|
||||||
@ -1015,7 +1015,7 @@ grpc::Status gRPCAgvServiceImpl::stopVelocityControl(grpc::ServerContext* contex
|
|||||||
api::CommandHeader_Feedback* response)
|
api::CommandHeader_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.AgvService/stopVelocityControl", request, response,
|
"/cmvr.api.AgvService/stopVelocityControl", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->device_id();
|
const std::string device_id = request->device_id();
|
||||||
@ -1095,7 +1095,7 @@ grpc::Status gRPCAgvServiceImpl::switchMap(grpc::ServerContext* context,
|
|||||||
api::AgvMapCommand_Feedback* response)
|
api::AgvMapCommand_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.AgvService/switchMap", request, response,
|
"/cmvr.api.AgvService/switchMap", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->header().device_id();
|
const std::string device_id = request->header().device_id();
|
||||||
@ -1126,7 +1126,7 @@ grpc::Status gRPCAgvServiceImpl::uploadMap(grpc::ServerContext* context,
|
|||||||
api::AgvMapCommand_Feedback* response)
|
api::AgvMapCommand_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.AgvService/uploadMap", request, response,
|
"/cmvr.api.AgvService/uploadMap", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->header().device_id();
|
const std::string device_id = request->header().device_id();
|
||||||
@ -1181,7 +1181,7 @@ grpc::Status gRPCAgvServiceImpl::startMapping(grpc::ServerContext* context,
|
|||||||
api::AgvStartMappingCommand_Feedback* response)
|
api::AgvStartMappingCommand_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.AgvService/startMapping", request, response,
|
"/cmvr.api.AgvService/startMapping", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->header().device_id();
|
const std::string device_id = request->header().device_id();
|
||||||
@ -1292,7 +1292,7 @@ grpc::Status gRPCAgvServiceImpl::stopMapping(grpc::ServerContext* context,
|
|||||||
api::CommandHeader_Feedback* response)
|
api::CommandHeader_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.AgvService/stopMapping", request, response,
|
"/cmvr.api.AgvService/stopMapping", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->device_id();
|
const std::string device_id = request->device_id();
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/grpc/include/grpc_arm_service.h"
|
#include "service/grpc/server/include/grpc_arm_service.h"
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@ -7,10 +7,10 @@
|
|||||||
#include <google/protobuf/util/time_util.h>
|
#include <google/protobuf/util/time_util.h>
|
||||||
|
|
||||||
#include "common/base/logging/logger.h"
|
#include "common/base/logging/logger.h"
|
||||||
#include "manager/control_authority/include/control_authority_manager.h"
|
#include "manager/control_authority_manager/include/control_authority_manager.h"
|
||||||
#include "service/grpc/include/grpc_command_transaction.h"
|
#include "service/grpc/server/include/grpc_command_transaction.h"
|
||||||
#include "service/grpc/include/grpc_security.h"
|
#include "service/grpc/server/include/grpc_security.h"
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
|
|
||||||
using google::protobuf::util::TimeUtil;
|
using google::protobuf::util::TimeUtil;
|
||||||
|
|
||||||
@ -381,7 +381,7 @@ grpc::Status gRPCArmServiceImpl::torqueOff(grpc::ServerContext* context,
|
|||||||
api::CommandHeader_Feedback* response)
|
api::CommandHeader_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.ArmService/torqueOff", request, response,
|
"/cmvr.api.ArmService/torqueOff", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->device_id();
|
const std::string device_id = request->device_id();
|
||||||
@ -415,7 +415,7 @@ grpc::Status gRPCArmServiceImpl::torqueOn(grpc::ServerContext* context,
|
|||||||
api::CommandHeader_Feedback* response)
|
api::CommandHeader_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.ArmService/torqueOn", request, response,
|
"/cmvr.api.ArmService/torqueOn", request, response,
|
||||||
[this, context, request, response](GrpcCommandTransaction& command) {
|
[this, context, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->device_id();
|
const std::string device_id = request->device_id();
|
||||||
@ -471,7 +471,7 @@ grpc::Status gRPCArmServiceImpl::moveJ(grpc::ServerContext* context,
|
|||||||
api::MoveJ_Response* response)
|
api::MoveJ_Response* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.ArmService/moveJ", request, response,
|
"/cmvr.api.ArmService/moveJ", request, response,
|
||||||
[this, context, request, response](GrpcCommandTransaction& command) {
|
[this, context, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->header().device_id();
|
const std::string device_id = request->header().device_id();
|
||||||
@ -511,7 +511,7 @@ grpc::Status gRPCArmServiceImpl::moveL(grpc::ServerContext* context,
|
|||||||
api::MoveL_Response* response)
|
api::MoveL_Response* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.ArmService/moveL", request, response,
|
"/cmvr.api.ArmService/moveL", request, response,
|
||||||
[this, context, request, response](GrpcCommandTransaction& command) {
|
[this, context, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->header().device_id();
|
const std::string device_id = request->header().device_id();
|
||||||
@ -553,7 +553,7 @@ grpc::Status gRPCArmServiceImpl::speedJ(grpc::ServerContext* context,
|
|||||||
api::SpeedJ_Response* response)
|
api::SpeedJ_Response* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.ArmService/speedJ", request, response,
|
"/cmvr.api.ArmService/speedJ", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->header().device_id();
|
const std::string device_id = request->header().device_id();
|
||||||
@ -593,7 +593,7 @@ grpc::Status gRPCArmServiceImpl::speedL(grpc::ServerContext* context,
|
|||||||
api::SpeedL_Response* response)
|
api::SpeedL_Response* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.ArmService/speedL", request, response,
|
"/cmvr.api.ArmService/speedL", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->header().device_id();
|
const std::string device_id = request->header().device_id();
|
||||||
@ -634,7 +634,7 @@ grpc::Status gRPCArmServiceImpl::servoJ(grpc::ServerContext* context,
|
|||||||
api::ServoJ_Response* response)
|
api::ServoJ_Response* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.ArmService/servoJ", request, response,
|
"/cmvr.api.ArmService/servoJ", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->header().device_id();
|
const std::string device_id = request->header().device_id();
|
||||||
@ -670,7 +670,7 @@ grpc::Status gRPCArmServiceImpl::stopMotion(grpc::ServerContext* context,
|
|||||||
api::CommandHeader_Feedback* response)
|
api::CommandHeader_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.ArmService/stopMotion", request, response,
|
"/cmvr.api.ArmService/stopMotion", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->device_id();
|
const std::string device_id = request->device_id();
|
||||||
@ -763,7 +763,7 @@ grpc::Status gRPCArmServiceImpl::calibrateZeroQ(grpc::ServerContext* context,
|
|||||||
api::CalibrateZeroQ_Response* response)
|
api::CalibrateZeroQ_Response* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.ArmService/calibrateZeroQ", request, response,
|
"/cmvr.api.ArmService/calibrateZeroQ", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->header().device_id();
|
const std::string device_id = request->header().device_id();
|
||||||
@ -821,7 +821,7 @@ grpc::Status gRPCArmServiceImpl::ExecuteJsonCommand(
|
|||||||
api::JsonDeviceCommand_Feedback* response)
|
api::JsonDeviceCommand_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.ArmService/ExecuteJsonCommand", request, response,
|
"/cmvr.api.ArmService/ExecuteJsonCommand", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->header().device_id();
|
const std::string device_id = request->header().device_id();
|
||||||
@ -870,7 +870,7 @@ grpc::Status gRPCArmServiceImpl::clearFault(grpc::ServerContext *context,
|
|||||||
cmvr::api::CommandHeader_Feedback *response)
|
cmvr::api::CommandHeader_Feedback *response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.ArmService/clearFault", request, response,
|
"/cmvr.api.ArmService/clearFault", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const std::string device_id = request->device_id();
|
const std::string device_id = request->device_id();
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/grpc/include/grpc_arm_teleop_service.h"
|
#include "service/grpc/server/include/grpc_arm_teleop_service.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
@ -14,9 +14,9 @@
|
|||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
#include "service/grpc/include/grpc_command_transaction.h"
|
#include "service/grpc/server/include/grpc_command_transaction.h"
|
||||||
#include "service/grpc/include/grpc_security.h"
|
#include "service/grpc/server/include/grpc_security.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
|
|
||||||
@ -440,7 +440,7 @@ ArmTeleopServiceImpl::ArmTeleopServiceImpl(
|
|||||||
std::shared_ptr<ArmTeleopBackend> backend,
|
std::shared_ptr<ArmTeleopBackend> backend,
|
||||||
control::ControlAuthorityManager* authority,
|
control::ControlAuthorityManager* authority,
|
||||||
std::shared_ptr<GrpcSecurityGateway> security_gateway,
|
std::shared_ptr<GrpcSecurityGateway> security_gateway,
|
||||||
safety::SafetyCoordinator* safety_coordinator)
|
safety::SafetyManager* safety_manager)
|
||||||
: backend_(std::move(backend)),
|
: backend_(std::move(backend)),
|
||||||
authority_(
|
authority_(
|
||||||
authority ? authority
|
authority ? authority
|
||||||
@ -448,7 +448,7 @@ ArmTeleopServiceImpl::ArmTeleopServiceImpl(
|
|||||||
security_gateway_(security_gateway
|
security_gateway_(security_gateway
|
||||||
? std::move(security_gateway)
|
? std::move(security_gateway)
|
||||||
: makeDefaultGrpcSecurityGateway()),
|
: makeDefaultGrpcSecurityGateway()),
|
||||||
safety_coordinator_(safety_coordinator)
|
safety_manager_(safety_manager)
|
||||||
{
|
{
|
||||||
if (!backend_) {
|
if (!backend_) {
|
||||||
backend_ = makeDisabledArmTeleopBackend();
|
backend_ = makeDisabledArmTeleopBackend();
|
||||||
@ -541,7 +541,7 @@ grpc::Status ArmTeleopServiceImpl::Teleoperate(
|
|||||||
});
|
});
|
||||||
|
|
||||||
std::optional<GrpcStreamingSafetySession> safety_session;
|
std::optional<GrpcStreamingSafetySession> safety_session;
|
||||||
if (safety_coordinator_) {
|
if (safety_manager_) {
|
||||||
GrpcStreamingSafetyOpen safety_open;
|
GrpcStreamingSafetyOpen safety_open;
|
||||||
safety_open.full_method_name =
|
safety_open.full_method_name =
|
||||||
"/cmvr.api.armteleop.v1.ArmTeleopService/Teleoperate";
|
"/cmvr.api.armteleop.v1.ArmTeleopService/Teleoperate";
|
||||||
@ -550,7 +550,7 @@ grpc::Status ArmTeleopServiceImpl::Teleoperate(
|
|||||||
safety_open.authority_generation = control_lease.generation;
|
safety_open.authority_generation = control_lease.generation;
|
||||||
safety_open.deadline = cmvr_grpc_call_guard.context().deadline;
|
safety_open.deadline = cmvr_grpc_call_guard.context().deadline;
|
||||||
safety_session.emplace(
|
safety_session.emplace(
|
||||||
*safety_coordinator_,
|
*safety_manager_,
|
||||||
cmvr_grpc_call_guard.context(),
|
cmvr_grpc_call_guard.context(),
|
||||||
std::move(safety_open));
|
std::move(safety_open));
|
||||||
if (!safety_session->admitted()) {
|
if (!safety_session->admitted()) {
|
||||||
@ -1,10 +1,10 @@
|
|||||||
#include "common/base/logging/logger.h"
|
#include "common/base/logging/logger.h"
|
||||||
#include "manager/media_source_hub/include/device_media_source_adapter.h"
|
#include "manager/media_source_manager/include/device_media_source_adapter.h"
|
||||||
#include "service/grpc/include/camera_operational_activity_registry.h"
|
#include "service/grpc/server/include/camera_operational_activity_registry.h"
|
||||||
#include "service/grpc/include/camera_ptz_activity_registry.h"
|
#include "service/grpc/server/include/camera_ptz_activity_registry.h"
|
||||||
#include "service/grpc/include/grpc_command_transaction.h"
|
#include "service/grpc/server/include/grpc_command_transaction.h"
|
||||||
#include "service/grpc/include/media_activity_coordinator.h"
|
#include "service/grpc/server/include/media_activity_coordinator.h"
|
||||||
#include "service/grpc/include/grpc_security.h"
|
#include "service/grpc/server/include/grpc_security.h"
|
||||||
//
|
//
|
||||||
// Created by xtkuang on 2025/6/1.
|
// Created by xtkuang on 2025/6/1.
|
||||||
//
|
//
|
||||||
@ -72,7 +72,7 @@ bool toPtzCommand(cmvr::api::ControlPtzCommand_Command command, PtzCommand& out)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// The legacy depth/RGBD RPCs acquire the camera's shared producer directly
|
// The legacy depth/RGBD RPCs acquire the camera's shared producer directly
|
||||||
// instead of going through MediaSourceHub. Keep that lease exception-safe:
|
// instead of going through MediaSourceManager. Keep that lease exception-safe:
|
||||||
// cancellation, a failed Write(), or any conversion error must release exactly
|
// cancellation, a failed Write(), or any conversion error must release exactly
|
||||||
// the one startStreaming() reference acquired by this call.
|
// the one startStreaming() reference acquired by this call.
|
||||||
class CameraStreamingLease final {
|
class CameraStreamingLease final {
|
||||||
@ -80,7 +80,7 @@ public:
|
|||||||
CameraStreamingLease(
|
CameraStreamingLease(
|
||||||
std::shared_ptr<AbstractCamera> camera,
|
std::shared_ptr<AbstractCamera> camera,
|
||||||
const MediaActivityCoordinator::Session& session,
|
const MediaActivityCoordinator::Session& session,
|
||||||
cmvr::safety::SafetyCoordinator& coordinator)
|
cmvr::safety::SafetyManager& coordinator)
|
||||||
: camera_(std::move(camera)) {
|
: camera_(std::move(camera)) {
|
||||||
(void)session.runIfCurrent([this, &coordinator] {
|
(void)session.runIfCurrent([this, &coordinator] {
|
||||||
auto dispatch = cmvr::media::beginMediaSourceStartDispatch(
|
auto dispatch = cmvr::media::beginMediaSourceStartDispatch(
|
||||||
@ -184,7 +184,7 @@ grpc::Status gRPCCameraServiceImpl::StartCamera(grpc::ServerContext* context,
|
|||||||
const api::StartCameraCommand_Request* request, api::StartCameraCommand_Feedback* response)
|
const api::StartCameraCommand_Request* request, api::StartCameraCommand_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.CameraService/StartCamera", request, response,
|
"/cmvr.api.CameraService/StartCamera", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
auto media_session = globalMediaActivityCoordinator().beginSession();
|
auto media_session = globalMediaActivityCoordinator().beginSession();
|
||||||
@ -234,7 +234,7 @@ grpc::Status gRPCCameraServiceImpl::StopCamera(grpc::ServerContext* context,
|
|||||||
const api::StopCameraCommand_Request* request, api::StopCameraCommand_Feedback* response)
|
const api::StopCameraCommand_Request* request, api::StopCameraCommand_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.CameraService/StopCamera", request, response,
|
"/cmvr.api.CameraService/StopCamera", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
string dev_id = request->header().device_id();
|
string dev_id = request->header().device_id();
|
||||||
@ -502,7 +502,7 @@ grpc::Status gRPCCameraServiceImpl::StartRecording(grpc::ServerContext* context,
|
|||||||
const api::StartCameraRecordingCommand_Request* request, api::StartCameraRecordingCommand_Feedback* response)
|
const api::StartCameraRecordingCommand_Request* request, api::StartCameraRecordingCommand_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.CameraService/StartRecording", request, response,
|
"/cmvr.api.CameraService/StartRecording", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
auto media_session = globalMediaActivityCoordinator().beginSession();
|
auto media_session = globalMediaActivityCoordinator().beginSession();
|
||||||
@ -540,7 +540,7 @@ grpc::Status gRPCCameraServiceImpl::StopRecording(grpc::ServerContext* context,
|
|||||||
const api::StopCameraRecordingCommand_Request* request, api::StopCameraRecordingCommand_Feedback* response)
|
const api::StopCameraRecordingCommand_Request* request, api::StopCameraRecordingCommand_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.CameraService/StopRecording", request, response,
|
"/cmvr.api.CameraService/StopRecording", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
string dev_id = request->header().device_id();
|
string dev_id = request->header().device_id();
|
||||||
@ -581,7 +581,7 @@ grpc::Status gRPCCameraServiceImpl::ControlPtz(grpc::ServerContext* context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
return executeServerDerivedGrpcCommand(
|
return executeServerDerivedGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.CameraService/ControlPtz", std::move(effective_policy),
|
"/cmvr.api.CameraService/ControlPtz", std::move(effective_policy),
|
||||||
request, response,
|
request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command_tx) {
|
[this, request, response](GrpcCommandTransaction& command_tx) {
|
||||||
@ -666,7 +666,7 @@ grpc::Status gRPCCameraServiceImpl::GetDepthImageStream(grpc::ServerContext* con
|
|||||||
return grpc::Status::OK;
|
return grpc::Status::OK;
|
||||||
}
|
}
|
||||||
CameraStreamingLease stream_lease(
|
CameraStreamingLease stream_lease(
|
||||||
dev, media_session, dmgr_.safetyCoordinator());
|
dev, media_session, dmgr_.safetyManager());
|
||||||
if (!stream_lease) {
|
if (!stream_lease) {
|
||||||
api::GetDepthImageStreamCommand_Feedback response;
|
api::GetDepthImageStreamCommand_Feedback response;
|
||||||
response.mutable_header()->set_success(false);
|
response.mutable_header()->set_success(false);
|
||||||
@ -763,7 +763,7 @@ grpc::Status gRPCCameraServiceImpl::GetRGBDImagesStream(grpc::ServerContext* con
|
|||||||
return grpc::Status::OK;
|
return grpc::Status::OK;
|
||||||
}
|
}
|
||||||
CameraStreamingLease stream_lease(
|
CameraStreamingLease stream_lease(
|
||||||
dev, media_session, dmgr_.safetyCoordinator());
|
dev, media_session, dmgr_.safetyManager());
|
||||||
if (!stream_lease) {
|
if (!stream_lease) {
|
||||||
api::GetRGBDImagesStreamCommand_Feedback response;
|
api::GetRGBDImagesStreamCommand_Feedback response;
|
||||||
response.mutable_header()->set_success(false);
|
response.mutable_header()->set_success(false);
|
||||||
@ -867,7 +867,7 @@ grpc::Status gRPCCameraServiceImpl::GetRGBImageStream(grpc::ServerContext* conte
|
|||||||
stream->Write(response);
|
stream->Write(response);
|
||||||
return grpc::Status::OK;
|
return grpc::Status::OK;
|
||||||
}
|
}
|
||||||
auto& media_hub = cmvr::media::globalMediaSourceHub();
|
auto& media_hub = cmvr::media::globalMediaSourceManager();
|
||||||
const std::string track_id = cmvr::media::cameraColorTrackId(dev_id);
|
const std::string track_id = cmvr::media::cameraColorTrackId(dev_id);
|
||||||
bool source_ready = false;
|
bool source_ready = false;
|
||||||
const bool source_setup_allowed = media_session.runIfCurrent([&] {
|
const bool source_setup_allowed = media_session.runIfCurrent([&] {
|
||||||
@ -885,15 +885,15 @@ grpc::Status gRPCCameraServiceImpl::GetRGBImageStream(grpc::ServerContext* conte
|
|||||||
return grpc::Status::OK;
|
return grpc::Status::OK;
|
||||||
}
|
}
|
||||||
auto source_dispatch = cmvr::media::beginMediaSourceStartDispatch(
|
auto source_dispatch = cmvr::media::beginMediaSourceStartDispatch(
|
||||||
dmgr_.safetyCoordinator(), dev_id);
|
dmgr_.safetyManager(), dev_id);
|
||||||
auto subscription = source_dispatch.acquired()
|
auto subscription = source_dispatch.acquired()
|
||||||
? media_hub.subscribe(
|
? media_hub.subscribe(
|
||||||
track_id,
|
track_id,
|
||||||
cmvr::media::MediaSourceHub::StartPosition::NEXT_PUBLISHED,
|
cmvr::media::MediaSourceManager::StartPosition::NEXT_PUBLISHED,
|
||||||
[context, &media_session] {
|
[context, &media_session] {
|
||||||
return context->IsCancelled() || media_session.cancelled();
|
return context->IsCancelled() || media_session.cancelled();
|
||||||
})
|
})
|
||||||
: cmvr::media::MediaSourceHub::Subscription{};
|
: cmvr::media::MediaSourceManager::Subscription{};
|
||||||
if (!subscription) {
|
if (!subscription) {
|
||||||
api::GetRGBImageStreamCommand_Feedback response;
|
api::GetRGBImageStreamCommand_Feedback response;
|
||||||
response.mutable_header()->set_success(false);
|
response.mutable_header()->set_success(false);
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/grpc/include/grpc_command_transaction.h"
|
#include "service/grpc/server/include/grpc_command_transaction.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <array>
|
#include <array>
|
||||||
@ -15,7 +15,7 @@
|
|||||||
#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
|
#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
|
||||||
#include <google/protobuf/util/time_util.h>
|
#include <google/protobuf/util/time_util.h>
|
||||||
|
|
||||||
#include "service/grpc/include/grpc_safety_proto.h"
|
#include "service/grpc/server/include/grpc_safety_proto.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
|
|
||||||
@ -145,7 +145,7 @@ std::uint64_t stableHash(
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool isEnforced(
|
bool isEnforced(
|
||||||
const safety::SafetyCoordinatorConfig& config,
|
const safety::SafetyManagerConfig& config,
|
||||||
const std::string& device_id)
|
const std::string& device_id)
|
||||||
{
|
{
|
||||||
switch (config.enforcement_mode) {
|
switch (config.enforcement_mode) {
|
||||||
@ -316,7 +316,7 @@ grpc::Status grpcStatusForSafetyReason(
|
|||||||
}
|
}
|
||||||
|
|
||||||
GrpcStreamingSafetySession::GrpcStreamingSafetySession(
|
GrpcStreamingSafetySession::GrpcStreamingSafetySession(
|
||||||
safety::SafetyCoordinator& coordinator,
|
safety::SafetyManager& coordinator,
|
||||||
const GrpcRequestContext& request_context,
|
const GrpcRequestContext& request_context,
|
||||||
GrpcStreamingSafetyOpen open)
|
GrpcStreamingSafetyOpen open)
|
||||||
: coordinator_(&coordinator),
|
: coordinator_(&coordinator),
|
||||||
@ -469,7 +469,7 @@ std::string deterministicGrpcPayloadHash(
|
|||||||
}
|
}
|
||||||
|
|
||||||
GrpcCommandTransaction::GrpcCommandTransaction(
|
GrpcCommandTransaction::GrpcCommandTransaction(
|
||||||
safety::SafetyCoordinator& coordinator,
|
safety::SafetyManager& coordinator,
|
||||||
GrpcRequestContext request_context,
|
GrpcRequestContext request_context,
|
||||||
GrpcMethodPolicy method_policy,
|
GrpcMethodPolicy method_policy,
|
||||||
const google::protobuf::Message& request,
|
const google::protobuf::Message& request,
|
||||||
@ -1166,7 +1166,7 @@ void GrpcCommandTransaction::abandon_() noexcept
|
|||||||
grpc::Status executeRegisteredGrpcCommand(
|
grpc::Status executeRegisteredGrpcCommand(
|
||||||
const std::shared_ptr<GrpcSecurityGateway>& gateway,
|
const std::shared_ptr<GrpcSecurityGateway>& gateway,
|
||||||
grpc::ServerContext* server_context,
|
grpc::ServerContext* server_context,
|
||||||
safety::SafetyCoordinator& coordinator,
|
safety::SafetyManager& coordinator,
|
||||||
const std::string& full_method_name,
|
const std::string& full_method_name,
|
||||||
const google::protobuf::Message* request,
|
const google::protobuf::Message* request,
|
||||||
google::protobuf::Message* response,
|
google::protobuf::Message* response,
|
||||||
@ -1208,7 +1208,7 @@ grpc::Status executeRegisteredGrpcCommand(
|
|||||||
grpc::Status executeServerDerivedGrpcCommand(
|
grpc::Status executeServerDerivedGrpcCommand(
|
||||||
const std::shared_ptr<GrpcSecurityGateway>& gateway,
|
const std::shared_ptr<GrpcSecurityGateway>& gateway,
|
||||||
grpc::ServerContext* server_context,
|
grpc::ServerContext* server_context,
|
||||||
safety::SafetyCoordinator& coordinator,
|
safety::SafetyManager& coordinator,
|
||||||
const std::string& full_method_name,
|
const std::string& full_method_name,
|
||||||
GrpcMethodPolicy effective_policy,
|
GrpcMethodPolicy effective_policy,
|
||||||
const google::protobuf::Message* request,
|
const google::protobuf::Message* request,
|
||||||
@ -15,11 +15,11 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "devices/dexhand/rh56dftp_dexhand/include/rh56dftp_dexhand.h"
|
#include "devices/dexhand/rh56dftp_dexhand/include/rh56dftp_dexhand.h"
|
||||||
#include "manager/control_authority/include/control_authority_manager.h"
|
#include "manager/control_authority_manager/include/control_authority_manager.h"
|
||||||
#include "service/grpc/include/grpc_command_transaction.h"
|
#include "service/grpc/server/include/grpc_command_transaction.h"
|
||||||
#include "service/grpc/include/media_activity_coordinator.h"
|
#include "service/grpc/server/include/media_activity_coordinator.h"
|
||||||
#include "service/grpc/include/grpc_security.h"
|
#include "service/grpc/server/include/grpc_security.h"
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace cmvr::service;
|
using namespace cmvr::service;
|
||||||
@ -367,7 +367,7 @@ grpc::Status gRPCDexHandServiceImpl::SetDexHandPos(grpc::ServerContext* context
|
|||||||
, const cmvr::api::SetDexHandPositionsCommand_Request* request
|
, const cmvr::api::SetDexHandPositionsCommand_Request* request
|
||||||
, cmvr::api::SetDexHandPositionsCommand_Feedback* response) {
|
, cmvr::api::SetDexHandPositionsCommand_Feedback* response) {
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.DexHandService/SetDexHandPos", request, response,
|
"/cmvr.api.DexHandService/SetDexHandPos", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
string dev_id = request->header().device_id();
|
string dev_id = request->header().device_id();
|
||||||
@ -415,7 +415,7 @@ grpc::Status gRPCDexHandServiceImpl::SetDexHandAngle(grpc::ServerContext* contex
|
|||||||
, const cmvr::api::SetDexHandAnglesCommand_Request* request
|
, const cmvr::api::SetDexHandAnglesCommand_Request* request
|
||||||
, cmvr::api::SetDexHandAnglesCommand_Feedback* response) {
|
, cmvr::api::SetDexHandAnglesCommand_Feedback* response) {
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.DexHandService/SetDexHandAngle", request, response,
|
"/cmvr.api.DexHandService/SetDexHandAngle", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
string dev_id = request->header().device_id();
|
string dev_id = request->header().device_id();
|
||||||
@ -477,7 +477,7 @@ grpc::Status gRPCDexHandServiceImpl::SetDexHandForce(grpc::ServerContext* contex
|
|||||||
, const cmvr::api::SetDexHandForceCommand_Request* request
|
, const cmvr::api::SetDexHandForceCommand_Request* request
|
||||||
, cmvr::api::SetDexHandForceCommand_Feedback* response) {
|
, cmvr::api::SetDexHandForceCommand_Feedback* response) {
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.DexHandService/SetDexHandForce", request, response,
|
"/cmvr.api.DexHandService/SetDexHandForce", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
string dev_id = request->header().device_id();
|
string dev_id = request->header().device_id();
|
||||||
@ -525,7 +525,7 @@ grpc::Status gRPCDexHandServiceImpl::SetDexHandSpeed(grpc::ServerContext* contex
|
|||||||
, const cmvr::api::SetDexHandSpeedCommand_Request* request
|
, const cmvr::api::SetDexHandSpeedCommand_Request* request
|
||||||
, cmvr::api::SetDexHandSpeedCommand_Feedback* response) {
|
, cmvr::api::SetDexHandSpeedCommand_Feedback* response) {
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.DexHandService/SetDexHandSpeed", request, response,
|
"/cmvr.api.DexHandService/SetDexHandSpeed", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
string dev_id = request->header().device_id();
|
string dev_id = request->header().device_id();
|
||||||
@ -573,7 +573,7 @@ grpc::Status gRPCDexHandServiceImpl::SetDexHandPresetAct(grpc::ServerContext* co
|
|||||||
, const cmvr::api::SetDexHandPresetActCommand_Request* request
|
, const cmvr::api::SetDexHandPresetActCommand_Request* request
|
||||||
, cmvr::api::SetDexHandPresetActCommand_Feedback* response) {
|
, cmvr::api::SetDexHandPresetActCommand_Feedback* response) {
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.DexHandService/SetDexHandPresetAct", request, response,
|
"/cmvr.api.DexHandService/SetDexHandPresetAct", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
string dev_id = request->header().device_id();
|
string dev_id = request->header().device_id();
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/grpc/include/grpc_error_logging_interceptor.h"
|
#include "service/grpc/server/include/grpc_error_logging_interceptor.h"
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@ -5,10 +5,10 @@
|
|||||||
#include "manager/device_manager/include/device_manager.h"
|
#include "manager/device_manager/include/device_manager.h"
|
||||||
#include "common/base/grpc_utils.h"
|
#include "common/base/grpc_utils.h"
|
||||||
#include "biohead/biohead_esp32/include/biohead_esp32.h"
|
#include "biohead/biohead_esp32/include/biohead_esp32.h"
|
||||||
#include "service/grpc/include/grpc_command_transaction.h"
|
#include "service/grpc/server/include/grpc_command_transaction.h"
|
||||||
#include "service/grpc/include/media_activity_coordinator.h"
|
#include "service/grpc/server/include/media_activity_coordinator.h"
|
||||||
#include "service/grpc/include/grpc_security.h"
|
#include "service/grpc/server/include/grpc_security.h"
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
@ -65,7 +65,7 @@ grpc::Status executeHeadOperationalCommand(
|
|||||||
Operation&& operation)
|
Operation&& operation)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway, context, device_manager.safetyCoordinator(),
|
security_gateway, context, device_manager.safetyManager(),
|
||||||
full_method_name, request, response,
|
full_method_name, request, response,
|
||||||
[&device_manager, request, response, rpc_name,
|
[&device_manager, request, response, rpc_name,
|
||||||
operation = std::forward<Operation>(operation)](
|
operation = std::forward<Operation>(operation)](
|
||||||
@ -245,7 +245,7 @@ grpc::Status gRPCMBioHeadServiceImpl::StreamExpression(
|
|||||||
safety_open.deadline =
|
safety_open.deadline =
|
||||||
cmvr_grpc_call_guard.context().deadline;
|
cmvr_grpc_call_guard.context().deadline;
|
||||||
safety_session.emplace(
|
safety_session.emplace(
|
||||||
dmgr_.safetyCoordinator(),
|
dmgr_.safetyManager(),
|
||||||
cmvr_grpc_call_guard.context(),
|
cmvr_grpc_call_guard.context(),
|
||||||
std::move(safety_open));
|
std::move(safety_open));
|
||||||
if (!safety_session->admitted()) {
|
if (!safety_session->admitted()) {
|
||||||
@ -417,7 +417,7 @@ grpc::Status gRPCMBioHeadServiceImpl::EmergencyStop(
|
|||||||
EmergencyStop_Feedback* response)
|
EmergencyStop_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.BioHeadService/EmergencyStop", request, response,
|
"/cmvr.api.BioHeadService/EmergencyStop", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const string dev_id = request->header().device_id();
|
const string dev_id = request->header().device_id();
|
||||||
@ -460,7 +460,7 @@ grpc::Status gRPCMBioHeadServiceImpl::SpeakStart(grpc::ServerContext* context, c
|
|||||||
grpc::Status gRPCMBioHeadServiceImpl::SpeakStop(grpc::ServerContext* context, const cmvr::api::SpeakStop_Request* request, cmvr::api::SpeakStop_Feedback* response)
|
grpc::Status gRPCMBioHeadServiceImpl::SpeakStop(grpc::ServerContext* context, const cmvr::api::SpeakStop_Request* request, cmvr::api::SpeakStop_Feedback* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.BioHeadService/SpeakStop", request, response,
|
"/cmvr.api.BioHeadService/SpeakStop", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
const string dev_id = request->header().device_id();
|
const string dev_id = request->header().device_id();
|
||||||
@ -14,9 +14,9 @@
|
|||||||
|
|
||||||
#include "common/base/logging/logger.h"
|
#include "common/base/logging/logger.h"
|
||||||
#include "manager/task_manager/include/task_manager.h"
|
#include "manager/task_manager/include/task_manager.h"
|
||||||
#include "service/grpc/include/grpc_command_transaction.h"
|
#include "service/grpc/server/include/grpc_command_transaction.h"
|
||||||
#include "service/grpc/include/grpc_security.h"
|
#include "service/grpc/server/include/grpc_security.h"
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
#include "task/touch_screen_task/include/touch_screen_task.h"
|
#include "task/touch_screen_task/include/touch_screen_task.h"
|
||||||
|
|
||||||
|
|
||||||
@ -92,7 +92,7 @@ grpc::Status gRPCHlcServiceImpl::touch(
|
|||||||
normalized_request.mutable_header()->set_device_id(arm_id);
|
normalized_request.mutable_header()->set_device_id(arm_id);
|
||||||
|
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.HlcService/touch", &normalized_request, response,
|
"/cmvr.api.HlcService/touch", &normalized_request, response,
|
||||||
[context, request, response, touch_task](
|
[context, request, response, touch_task](
|
||||||
GrpcCommandTransaction& command) {
|
GrpcCommandTransaction& command) {
|
||||||
@ -1,8 +1,8 @@
|
|||||||
#include "common/base/logging/logger.h"
|
#include "common/base/logging/logger.h"
|
||||||
#include "manager/media_source_hub/include/device_media_source_adapter.h"
|
#include "manager/media_source_manager/include/device_media_source_adapter.h"
|
||||||
#include "service/grpc/include/grpc_command_transaction.h"
|
#include "service/grpc/server/include/grpc_command_transaction.h"
|
||||||
#include "service/grpc/include/media_activity_coordinator.h"
|
#include "service/grpc/server/include/media_activity_coordinator.h"
|
||||||
#include "service/grpc/include/grpc_security.h"
|
#include "service/grpc/server/include/grpc_security.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
@ -84,7 +84,7 @@ grpc::Status gRPCMicroPhoneServiceImpl::GetStatus(grpc::ServerContext* context,
|
|||||||
grpc::Status gRPCMicroPhoneServiceImpl::StartRecord(grpc::ServerContext* context,
|
grpc::Status gRPCMicroPhoneServiceImpl::StartRecord(grpc::ServerContext* context,
|
||||||
const api::StartMicRecordingCommand_Request* request, api::StartMicRecordingCommand_Feedback* response) {
|
const api::StartMicRecordingCommand_Request* request, api::StartMicRecordingCommand_Feedback* response) {
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.MicPhoneService/StartRecord", request, response,
|
"/cmvr.api.MicPhoneService/StartRecord", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
auto media_session = globalMediaActivityCoordinator().beginSession();
|
auto media_session = globalMediaActivityCoordinator().beginSession();
|
||||||
@ -131,7 +131,7 @@ grpc::Status gRPCMicroPhoneServiceImpl::StartRecord(grpc::ServerContext* context
|
|||||||
grpc::Status gRPCMicroPhoneServiceImpl::StopRecord(grpc::ServerContext* context,
|
grpc::Status gRPCMicroPhoneServiceImpl::StopRecord(grpc::ServerContext* context,
|
||||||
const api::StopMicRecordingCommand_Request* request, api::StopMicRecordingCommand_Feedback* response) {
|
const api::StopMicRecordingCommand_Request* request, api::StopMicRecordingCommand_Feedback* response) {
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.MicPhoneService/StopRecord", request, response,
|
"/cmvr.api.MicPhoneService/StopRecord", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
string dev_id = request->header().device_id();
|
string dev_id = request->header().device_id();
|
||||||
@ -154,7 +154,7 @@ grpc::Status gRPCMicroPhoneServiceImpl::StopRecord(grpc::ServerContext* context,
|
|||||||
grpc::Status gRPCMicroPhoneServiceImpl::PauseRecord(grpc::ServerContext* context,
|
grpc::Status gRPCMicroPhoneServiceImpl::PauseRecord(grpc::ServerContext* context,
|
||||||
const api::PauseMicRecordingCommand_Request* request, api::PauseMicRecordingCommand_Feedback* response) {
|
const api::PauseMicRecordingCommand_Request* request, api::PauseMicRecordingCommand_Feedback* response) {
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.MicPhoneService/PauseRecord", request, response,
|
"/cmvr.api.MicPhoneService/PauseRecord", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
string dev_id = request->header().device_id();
|
string dev_id = request->header().device_id();
|
||||||
@ -177,7 +177,7 @@ grpc::Status gRPCMicroPhoneServiceImpl::PauseRecord(grpc::ServerContext* context
|
|||||||
grpc::Status gRPCMicroPhoneServiceImpl::ResumeRecord(grpc::ServerContext* context,
|
grpc::Status gRPCMicroPhoneServiceImpl::ResumeRecord(grpc::ServerContext* context,
|
||||||
const api::ResumeMicRecordingCommand_Request* request, api::ResumeMicRecordingCommand_Feedback* response) {
|
const api::ResumeMicRecordingCommand_Request* request, api::ResumeMicRecordingCommand_Feedback* response) {
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.MicPhoneService/ResumeRecord", request, response,
|
"/cmvr.api.MicPhoneService/ResumeRecord", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
auto media_session = globalMediaActivityCoordinator().beginSession();
|
auto media_session = globalMediaActivityCoordinator().beginSession();
|
||||||
@ -240,7 +240,7 @@ grpc::Status gRPCMicroPhoneServiceImpl::StreamAudio(grpc::ServerContext* context
|
|||||||
return grpc::Status::OK;
|
return grpc::Status::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& media_hub = cmvr::media::globalMediaSourceHub();
|
auto& media_hub = cmvr::media::globalMediaSourceManager();
|
||||||
const std::string track_id = cmvr::media::microphoneTrackId(dev_id);
|
const std::string track_id = cmvr::media::microphoneTrackId(dev_id);
|
||||||
bool source_ready = false;
|
bool source_ready = false;
|
||||||
const bool source_setup_allowed = media_session.runIfCurrent([&] {
|
const bool source_setup_allowed = media_session.runIfCurrent([&] {
|
||||||
@ -260,15 +260,15 @@ grpc::Status gRPCMicroPhoneServiceImpl::StreamAudio(grpc::ServerContext* context
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto source_dispatch = cmvr::media::beginMediaSourceStartDispatch(
|
auto source_dispatch = cmvr::media::beginMediaSourceStartDispatch(
|
||||||
dmgr_.safetyCoordinator(), dev_id);
|
dmgr_.safetyManager(), dev_id);
|
||||||
auto subscription = source_dispatch.acquired()
|
auto subscription = source_dispatch.acquired()
|
||||||
? media_hub.subscribe(
|
? media_hub.subscribe(
|
||||||
track_id,
|
track_id,
|
||||||
cmvr::media::MediaSourceHub::StartPosition::NEXT_PUBLISHED,
|
cmvr::media::MediaSourceManager::StartPosition::NEXT_PUBLISHED,
|
||||||
[context, &media_session] {
|
[context, &media_session] {
|
||||||
return context->IsCancelled() || media_session.cancelled();
|
return context->IsCancelled() || media_session.cancelled();
|
||||||
})
|
})
|
||||||
: cmvr::media::MediaSourceHub::Subscription{};
|
: cmvr::media::MediaSourceManager::Subscription{};
|
||||||
if (!subscription) {
|
if (!subscription) {
|
||||||
api::StreamMicAudioCommand_Feedback feedback;
|
api::StreamMicAudioCommand_Feedback feedback;
|
||||||
feedback.mutable_header()->set_success(false);
|
feedback.mutable_header()->set_success(false);
|
||||||
@ -356,7 +356,7 @@ grpc::Status gRPCMicroPhoneServiceImpl::StreamAudio(grpc::ServerContext* context
|
|||||||
grpc::Status gRPCMicroPhoneServiceImpl::SetVolume(grpc::ServerContext* context,
|
grpc::Status gRPCMicroPhoneServiceImpl::SetVolume(grpc::ServerContext* context,
|
||||||
const api::SetMicPhoneVolumeCommand_Request* request, api::SetMicPhoneVolumeCommand_Feedback* response) {
|
const api::SetMicPhoneVolumeCommand_Request* request, api::SetMicPhoneVolumeCommand_Feedback* response) {
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.MicPhoneService/SetVolume", request, response,
|
"/cmvr.api.MicPhoneService/SetVolume", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
string dev_id = request->header().device_id();
|
string dev_id = request->header().device_id();
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/grpc/include/grpc_motor_service.h"
|
#include "service/grpc/server/include/grpc_motor_service.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@ -15,9 +15,9 @@
|
|||||||
#include "common/base/logging/logger.h"
|
#include "common/base/logging/logger.h"
|
||||||
#include "devices/motor/manager/include/motor_manager.h"
|
#include "devices/motor/manager/include/motor_manager.h"
|
||||||
#include "manager/device_manager/include/device_manager.h"
|
#include "manager/device_manager/include/device_manager.h"
|
||||||
#include "service/grpc/include/grpc_command_transaction.h"
|
#include "service/grpc/server/include/grpc_command_transaction.h"
|
||||||
#include "service/grpc/include/grpc_security.h"
|
#include "service/grpc/server/include/grpc_security.h"
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
|
|
||||||
@ -870,7 +870,7 @@ grpc::Status gRPCMotorServiceImpl::setZero(
|
|||||||
api::MotorCommandResponse* response)
|
api::MotorCommandResponse* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.MotorService/setZero", request, response,
|
"/cmvr.api.MotorService/setZero", request, response,
|
||||||
[this, context, request, response](GrpcCommandTransaction& command) {
|
[this, context, request, response](GrpcCommandTransaction& command) {
|
||||||
return runUnaryGuarded(
|
return runUnaryGuarded(
|
||||||
@ -892,7 +892,7 @@ grpc::Status gRPCMotorServiceImpl::moveToZero(
|
|||||||
api::MotorCommandResponse* response)
|
api::MotorCommandResponse* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.MotorService/moveToZero", request, response,
|
"/cmvr.api.MotorService/moveToZero", request, response,
|
||||||
[this, context, request, response](GrpcCommandTransaction& command) {
|
[this, context, request, response](GrpcCommandTransaction& command) {
|
||||||
return runUnaryGuarded(
|
return runUnaryGuarded(
|
||||||
@ -914,7 +914,7 @@ grpc::Status gRPCMotorServiceImpl::profilePosition(
|
|||||||
api::MotorCommandResponse* response)
|
api::MotorCommandResponse* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.MotorService/profilePosition", request, response,
|
"/cmvr.api.MotorService/profilePosition", request, response,
|
||||||
[this, context, request, response](GrpcCommandTransaction& command) {
|
[this, context, request, response](GrpcCommandTransaction& command) {
|
||||||
return runUnaryGuarded(
|
return runUnaryGuarded(
|
||||||
@ -936,7 +936,7 @@ grpc::Status gRPCMotorServiceImpl::profileVelocity(
|
|||||||
api::MotorCommandResponse* response)
|
api::MotorCommandResponse* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.MotorService/profileVelocity", request, response,
|
"/cmvr.api.MotorService/profileVelocity", request, response,
|
||||||
[this, context, request, response](GrpcCommandTransaction& command) {
|
[this, context, request, response](GrpcCommandTransaction& command) {
|
||||||
return runUnaryGuarded(
|
return runUnaryGuarded(
|
||||||
@ -1004,7 +1004,7 @@ grpc::Status gRPCMotorServiceImpl::emergencyStop(
|
|||||||
api::MotorCommandResponse* response)
|
api::MotorCommandResponse* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.MotorService/emergencyStop", request, response,
|
"/cmvr.api.MotorService/emergencyStop", request, response,
|
||||||
[this, context, request, response](GrpcCommandTransaction& command) {
|
[this, context, request, response](GrpcCommandTransaction& command) {
|
||||||
return runUnaryGuarded(
|
return runUnaryGuarded(
|
||||||
@ -1039,7 +1039,7 @@ grpc::Status gRPCMotorServiceImpl::setEnabled(
|
|||||||
api::MotorCommandResponse* response)
|
api::MotorCommandResponse* response)
|
||||||
{
|
{
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.MotorService/setEnabled", request, response,
|
"/cmvr.api.MotorService/setEnabled", request, response,
|
||||||
[this, context, request, response](GrpcCommandTransaction& command) {
|
[this, context, request, response](GrpcCommandTransaction& command) {
|
||||||
return runUnaryGuarded(
|
return runUnaryGuarded(
|
||||||
@ -1821,7 +1821,7 @@ grpc::Status gRPCMotorServiceImpl::streamCyclicPositionImpl(
|
|||||||
safety_open.authority_generation = generation;
|
safety_open.authority_generation = generation;
|
||||||
safety_open.deadline = request_context.deadline;
|
safety_open.deadline = request_context.deadline;
|
||||||
GrpcStreamingSafetySession safety_session(
|
GrpcStreamingSafetySession safety_session(
|
||||||
dmgr_.safetyCoordinator(), request_context,
|
dmgr_.safetyManager(), request_context,
|
||||||
std::move(safety_open));
|
std::move(safety_open));
|
||||||
if (!safety_session.admitted()) {
|
if (!safety_session.admitted()) {
|
||||||
return safety_session.status();
|
return safety_session.status();
|
||||||
@ -1980,7 +1980,7 @@ grpc::Status gRPCMotorServiceImpl::streamCyclicVelocityImpl(
|
|||||||
safety_open.authority_generation = generation;
|
safety_open.authority_generation = generation;
|
||||||
safety_open.deadline = request_context.deadline;
|
safety_open.deadline = request_context.deadline;
|
||||||
GrpcStreamingSafetySession safety_session(
|
GrpcStreamingSafetySession safety_session(
|
||||||
dmgr_.safetyCoordinator(), request_context,
|
dmgr_.safetyManager(), request_context,
|
||||||
std::move(safety_open));
|
std::move(safety_open));
|
||||||
if (!safety_session.admitted()) {
|
if (!safety_session.admitted()) {
|
||||||
return safety_session.status();
|
return safety_session.status();
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/grpc/include/grpc_recovery_audit.h"
|
#include "service/grpc/server/include/grpc_recovery_audit.h"
|
||||||
|
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/grpc/include/grpc_robot_arm_teleop_backend.h"
|
#include "service/grpc/server/include/grpc_robot_arm_teleop_backend.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/grpc/include/grpc_safety_participants.h"
|
#include "service/grpc/server/include/grpc_safety_participants.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
@ -12,16 +12,16 @@
|
|||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "manager/media_source_hub/include/device_media_source_adapter.h"
|
#include "manager/media_source_manager/include/device_media_source_adapter.h"
|
||||||
#include "manager/safety/include/safety_coordinator.h"
|
#include "manager/safety_manager/include/safety_manager.h"
|
||||||
#include "manager/task_manager/include/task_manager.h"
|
#include "manager/task_manager/include/task_manager.h"
|
||||||
#include "service/action/include/action_queue_executor.h"
|
#include "service/grpc/action/include/action_queue_executor.h"
|
||||||
#include "service/grpc/include/camera_operational_activity_registry.h"
|
#include "service/grpc/server/include/camera_operational_activity_registry.h"
|
||||||
#include "service/grpc/include/camera_ptz_activity_registry.h"
|
#include "service/grpc/server/include/camera_ptz_activity_registry.h"
|
||||||
#include "service/grpc/include/media_activity_coordinator.h"
|
#include "service/grpc/server/include/media_activity_coordinator.h"
|
||||||
#include "service/grpc/include/motor_activity_coordinator.h"
|
#include "service/grpc/server/include/motor_activity_coordinator.h"
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
#include "service/stop_all/include/stop_operation_dispatcher.h"
|
#include "service/grpc/stop_all/include/stop_operation_dispatcher.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
|
|
||||||
@ -966,7 +966,7 @@ std::vector<DeferredStopOperation> mediaSourceStopOperations()
|
|||||||
const auto merge = [&unique_ids](const std::vector<std::string>& ids) {
|
const auto merge = [&unique_ids](const std::vector<std::string>& ids) {
|
||||||
unique_ids.insert(ids.begin(), ids.end());
|
unique_ids.insert(ids.begin(), ids.end());
|
||||||
};
|
};
|
||||||
merge(media::globalMediaSourceHub().trackedSourceIds());
|
merge(media::globalMediaSourceManager().trackedSourceIds());
|
||||||
merge(globalCameraOperationalActivityRegistry().trackedDeviceIds());
|
merge(globalCameraOperationalActivityRegistry().trackedDeviceIds());
|
||||||
|
|
||||||
std::vector<DeferredStopOperation> operations;
|
std::vector<DeferredStopOperation> operations;
|
||||||
@ -976,7 +976,7 @@ std::vector<DeferredStopOperation> mediaSourceStopOperations()
|
|||||||
"media-source:" + id,
|
"media-source:" + id,
|
||||||
[id] {
|
[id] {
|
||||||
std::vector<std::string> failures;
|
std::vector<std::string> failures;
|
||||||
bool stopped = media::globalMediaSourceHub()
|
bool stopped = media::globalMediaSourceManager()
|
||||||
.stopSourcesForDevice(id, &failures);
|
.stopSourcesForDevice(id, &failures);
|
||||||
if (!globalCameraOperationalActivityRegistry()
|
if (!globalCameraOperationalActivityRegistry()
|
||||||
.stopActivitiesForDevice(id, &failures)) {
|
.stopActivitiesForDevice(id, &failures)) {
|
||||||
@ -996,11 +996,11 @@ struct SharedParticipants {
|
|||||||
};
|
};
|
||||||
|
|
||||||
std::mutex shared_participants_mutex;
|
std::mutex shared_participants_mutex;
|
||||||
std::unordered_map<safety::SafetyCoordinator*, SharedParticipants>
|
std::unordered_map<safety::SafetyManager*, SharedParticipants>
|
||||||
shared_participants;
|
shared_participants;
|
||||||
|
|
||||||
void acquireSharedParticipants(
|
void acquireSharedParticipants(
|
||||||
safety::SafetyCoordinator& coordinator,
|
safety::SafetyManager& coordinator,
|
||||||
const std::shared_ptr<StopOperationDispatcher>& dispatcher)
|
const std::shared_ptr<StopOperationDispatcher>& dispatcher)
|
||||||
{
|
{
|
||||||
std::lock_guard lock(shared_participants_mutex);
|
std::lock_guard lock(shared_participants_mutex);
|
||||||
@ -1057,7 +1057,7 @@ void acquireSharedParticipants(
|
|||||||
shared_participants.emplace(&coordinator, std::move(entry));
|
shared_participants.emplace(&coordinator, std::move(entry));
|
||||||
}
|
}
|
||||||
|
|
||||||
void releaseSharedParticipants(safety::SafetyCoordinator& coordinator) noexcept
|
void releaseSharedParticipants(safety::SafetyManager& coordinator) noexcept
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
std::lock_guard lock(shared_participants_mutex);
|
std::lock_guard lock(shared_participants_mutex);
|
||||||
@ -1078,7 +1078,7 @@ void releaseSharedParticipants(safety::SafetyCoordinator& coordinator) noexcept
|
|||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
struct GrpcSafetyParticipantRegistration::Impl {
|
struct GrpcSafetyParticipantRegistration::Impl {
|
||||||
safety::SafetyCoordinator* coordinator{nullptr};
|
safety::SafetyManager* coordinator{nullptr};
|
||||||
std::string action_participant_id;
|
std::string action_participant_id;
|
||||||
bool shared_acquired{false};
|
bool shared_acquired{false};
|
||||||
|
|
||||||
@ -1112,7 +1112,7 @@ GrpcSafetyParticipantRegistration::operator=(
|
|||||||
|
|
||||||
std::unique_ptr<GrpcSafetyParticipantRegistration>
|
std::unique_ptr<GrpcSafetyParticipantRegistration>
|
||||||
registerGrpcSafetyParticipants(
|
registerGrpcSafetyParticipants(
|
||||||
safety::SafetyCoordinator& coordinator,
|
safety::SafetyManager& coordinator,
|
||||||
std::shared_ptr<ActionQueueExecutor> action_queue,
|
std::shared_ptr<ActionQueueExecutor> action_queue,
|
||||||
std::shared_ptr<StopOperationDispatcher> stop_dispatcher)
|
std::shared_ptr<StopOperationDispatcher> stop_dispatcher)
|
||||||
{
|
{
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/grpc/include/grpc_safety_proto.h"
|
#include "service/grpc/server/include/grpc_safety_proto.h"
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/grpc/include/grpc_security.h"
|
#include "service/grpc/server/include/grpc_security.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
@ -1,7 +1,7 @@
|
|||||||
#include "common/base/logging/logger.h"
|
#include "common/base/logging/logger.h"
|
||||||
#include "service/grpc/include/grpc_command_transaction.h"
|
#include "service/grpc/server/include/grpc_command_transaction.h"
|
||||||
#include "service/grpc/include/media_activity_coordinator.h"
|
#include "service/grpc/server/include/media_activity_coordinator.h"
|
||||||
#include "service/grpc/include/grpc_security.h"
|
#include "service/grpc/server/include/grpc_security.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
@ -147,7 +147,7 @@ grpc::Status gRPCSpeakerServiceImpl::GetStatus(grpc::ServerContext* context,
|
|||||||
grpc::Status gRPCSpeakerServiceImpl::PlayAudio(grpc::ServerContext* context,
|
grpc::Status gRPCSpeakerServiceImpl::PlayAudio(grpc::ServerContext* context,
|
||||||
const api::PlayAudioCommand_Request* request, api::PlayAudioCommand_Feedback* response) {
|
const api::PlayAudioCommand_Request* request, api::PlayAudioCommand_Feedback* response) {
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.SpeakerService/PlayAudio", request, response,
|
"/cmvr.api.SpeakerService/PlayAudio", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
auto media_session = globalMediaActivityCoordinator().beginSession();
|
auto media_session = globalMediaActivityCoordinator().beginSession();
|
||||||
@ -240,7 +240,7 @@ grpc::Status gRPCSpeakerServiceImpl::StreamAudio(grpc::ServerContext* context,
|
|||||||
safety_open.deadline =
|
safety_open.deadline =
|
||||||
cmvr_grpc_call_guard.context().deadline;
|
cmvr_grpc_call_guard.context().deadline;
|
||||||
safety_session.emplace(
|
safety_session.emplace(
|
||||||
dmgr_.safetyCoordinator(),
|
dmgr_.safetyManager(),
|
||||||
cmvr_grpc_call_guard.context(),
|
cmvr_grpc_call_guard.context(),
|
||||||
std::move(safety_open));
|
std::move(safety_open));
|
||||||
if (!safety_session->admitted()) {
|
if (!safety_session->admitted()) {
|
||||||
@ -307,7 +307,7 @@ grpc::Status gRPCSpeakerServiceImpl::StreamAudio(grpc::ServerContext* context,
|
|||||||
grpc::Status gRPCSpeakerServiceImpl::StopPlayback(grpc::ServerContext* context,
|
grpc::Status gRPCSpeakerServiceImpl::StopPlayback(grpc::ServerContext* context,
|
||||||
const api::StopSpeakerCommand_Request* request, api::StopSpeakerCommand_Feedback* response) {
|
const api::StopSpeakerCommand_Request* request, api::StopSpeakerCommand_Feedback* response) {
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.SpeakerService/StopPlayback", request, response,
|
"/cmvr.api.SpeakerService/StopPlayback", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
string dev_id = request->header().device_id();
|
string dev_id = request->header().device_id();
|
||||||
@ -332,7 +332,7 @@ grpc::Status gRPCSpeakerServiceImpl::StopPlayback(grpc::ServerContext* context,
|
|||||||
grpc::Status gRPCSpeakerServiceImpl::PausePlayback(grpc::ServerContext* context,
|
grpc::Status gRPCSpeakerServiceImpl::PausePlayback(grpc::ServerContext* context,
|
||||||
const api::PauseSpeakerCommand_Request* request, api::PauseSpeakerCommand_Feedback* response) {
|
const api::PauseSpeakerCommand_Request* request, api::PauseSpeakerCommand_Feedback* response) {
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.SpeakerService/PausePlayback", request, response,
|
"/cmvr.api.SpeakerService/PausePlayback", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
string dev_id = request->header().device_id();
|
string dev_id = request->header().device_id();
|
||||||
@ -355,7 +355,7 @@ grpc::Status gRPCSpeakerServiceImpl::PausePlayback(grpc::ServerContext* context,
|
|||||||
grpc::Status gRPCSpeakerServiceImpl::ResumePlayback(grpc::ServerContext* context,
|
grpc::Status gRPCSpeakerServiceImpl::ResumePlayback(grpc::ServerContext* context,
|
||||||
const api::ResumeSpeakerCommand_Request* request, api::ResumeSpeakerCommand_Feedback* response) {
|
const api::ResumeSpeakerCommand_Request* request, api::ResumeSpeakerCommand_Feedback* response) {
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.SpeakerService/ResumePlayback", request, response,
|
"/cmvr.api.SpeakerService/ResumePlayback", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
auto media_session = globalMediaActivityCoordinator().beginSession();
|
auto media_session = globalMediaActivityCoordinator().beginSession();
|
||||||
@ -396,7 +396,7 @@ grpc::Status gRPCSpeakerServiceImpl::ResumePlayback(grpc::ServerContext* context
|
|||||||
grpc::Status gRPCSpeakerServiceImpl::SetVolume(grpc::ServerContext* context,
|
grpc::Status gRPCSpeakerServiceImpl::SetVolume(grpc::ServerContext* context,
|
||||||
const api::SetSpeakerVolumeCommand_Request* request, api::SetSpeakerVolumeCommand_Feedback* response) {
|
const api::SetSpeakerVolumeCommand_Request* request, api::SetSpeakerVolumeCommand_Feedback* response) {
|
||||||
return executeRegisteredGrpcCommand(
|
return executeRegisteredGrpcCommand(
|
||||||
security_gateway_, context, dmgr_.safetyCoordinator(),
|
security_gateway_, context, dmgr_.safetyManager(),
|
||||||
"/cmvr.api.SpeakerService/SetVolume", request, response,
|
"/cmvr.api.SpeakerService/SetVolume", request, response,
|
||||||
[this, request, response](GrpcCommandTransaction& command) {
|
[this, request, response](GrpcCommandTransaction& command) {
|
||||||
string dev_id = request->header().device_id();
|
string dev_id = request->header().device_id();
|
||||||
@ -27,20 +27,20 @@
|
|||||||
#include "devices/gripper/abstract_gripper.h"
|
#include "devices/gripper/abstract_gripper.h"
|
||||||
#include "devices/microphone/abstract_microphone.h"
|
#include "devices/microphone/abstract_microphone.h"
|
||||||
#include "devices/speaker/abstract_speaker.h"
|
#include "devices/speaker/abstract_speaker.h"
|
||||||
#include "manager/control_authority/include/control_authority_manager.h"
|
#include "manager/control_authority_manager/include/control_authority_manager.h"
|
||||||
#include "manager/media_source_hub/include/device_media_source_adapter.h"
|
#include "manager/media_source_manager/include/device_media_source_adapter.h"
|
||||||
#include "manager/task_manager/include/task_manager.h"
|
#include "manager/task_manager/include/task_manager.h"
|
||||||
#include "service/action/include/action_queue_executor.h"
|
#include "service/grpc/action/include/action_queue_executor.h"
|
||||||
#include "service/grpc/include/camera_operational_activity_registry.h"
|
#include "service/grpc/server/include/camera_operational_activity_registry.h"
|
||||||
#include "service/grpc/include/camera_ptz_activity_registry.h"
|
#include "service/grpc/server/include/camera_ptz_activity_registry.h"
|
||||||
#include "service/grpc/include/grpc_recovery_audit.h"
|
#include "service/grpc/server/include/grpc_recovery_audit.h"
|
||||||
#include "service/grpc/include/grpc_safety_proto.h"
|
#include "service/grpc/server/include/grpc_safety_proto.h"
|
||||||
#include "service/grpc/include/grpc_safety_participants.h"
|
#include "service/grpc/server/include/grpc_safety_participants.h"
|
||||||
#include "service/grpc/include/grpc_security.h"
|
#include "service/grpc/server/include/grpc_security.h"
|
||||||
#include "service/grpc/include/media_activity_coordinator.h"
|
#include "service/grpc/server/include/media_activity_coordinator.h"
|
||||||
#include "service/grpc/include/motor_activity_coordinator.h"
|
#include "service/grpc/server/include/motor_activity_coordinator.h"
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
#include "service/stop_all/include/stop_operation_dispatcher.h"
|
#include "service/grpc/stop_all/include/stop_operation_dispatcher.h"
|
||||||
|
|
||||||
using namespace cmvr::device;
|
using namespace cmvr::device;
|
||||||
using namespace cmvr::service;
|
using namespace cmvr::service;
|
||||||
@ -718,7 +718,7 @@ StopOutcome stopCameraActivities(
|
|||||||
const std::shared_ptr<cmvr::device::AbstractCamera>& camera)
|
const std::shared_ptr<cmvr::device::AbstractCamera>& camera)
|
||||||
{
|
{
|
||||||
std::vector<std::string> failures;
|
std::vector<std::string> failures;
|
||||||
bool stopped = cmvr::media::globalMediaSourceHub()
|
bool stopped = cmvr::media::globalMediaSourceManager()
|
||||||
.stopSourcesForDevice(device_id, &failures);
|
.stopSourcesForDevice(device_id, &failures);
|
||||||
if (!globalCameraPtzActivityRegistry().stopActivitiesForDevice(
|
if (!globalCameraPtzActivityRegistry().stopActivitiesForDevice(
|
||||||
device_id, &failures)) {
|
device_id, &failures)) {
|
||||||
@ -767,7 +767,7 @@ StopOutcome stopMicrophone(
|
|||||||
const std::shared_ptr<cmvr::device::AbstractMicrophone>& microphone)
|
const std::shared_ptr<cmvr::device::AbstractMicrophone>& microphone)
|
||||||
{
|
{
|
||||||
std::vector<std::string> failures;
|
std::vector<std::string> failures;
|
||||||
bool stopped = cmvr::media::globalMediaSourceHub()
|
bool stopped = cmvr::media::globalMediaSourceManager()
|
||||||
.stopSourcesForDevice(device_id, &failures);
|
.stopSourcesForDevice(device_id, &failures);
|
||||||
try {
|
try {
|
||||||
cmvr::device::MicrophoneState state{};
|
cmvr::device::MicrophoneState state{};
|
||||||
@ -811,7 +811,7 @@ StopOutcome stopSpeaker(
|
|||||||
StopOutcome stopTrackedMediaActivities(const std::string& device_id)
|
StopOutcome stopTrackedMediaActivities(const std::string& device_id)
|
||||||
{
|
{
|
||||||
std::vector<std::string> failures;
|
std::vector<std::string> failures;
|
||||||
bool stopped = cmvr::media::globalMediaSourceHub()
|
bool stopped = cmvr::media::globalMediaSourceManager()
|
||||||
.stopSourcesForDevice(device_id, &failures);
|
.stopSourcesForDevice(device_id, &failures);
|
||||||
if (!globalCameraPtzActivityRegistry().stopActivitiesForDevice(
|
if (!globalCameraPtzActivityRegistry().stopActivitiesForDevice(
|
||||||
device_id, &failures)) {
|
device_id, &failures)) {
|
||||||
@ -1162,7 +1162,7 @@ gRPCSystemServiceImpl::gRPCSystemServiceImpl(
|
|||||||
acquireProcessStopDispatcher(stop_dispatcher_);
|
acquireProcessStopDispatcher(stop_dispatcher_);
|
||||||
try {
|
try {
|
||||||
safety_participant_registration_ = registerGrpcSafetyParticipants(
|
safety_participant_registration_ = registerGrpcSafetyParticipants(
|
||||||
dmgr_.safetyCoordinator(), action_queue_, stop_dispatcher_);
|
dmgr_.safetyManager(), action_queue_, stop_dispatcher_);
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
releaseProcessStopDispatcher(stop_dispatcher_);
|
releaseProcessStopDispatcher(stop_dispatcher_);
|
||||||
throw;
|
throw;
|
||||||
@ -1217,7 +1217,7 @@ grpc::Status gRPCSystemServiceImpl::GetSystemInfo(grpc::ServerContext* context,
|
|||||||
toString(security.recovery_exposure));
|
toString(security.recovery_exposure));
|
||||||
response->set_grpc_insecure_non_loopback(
|
response->set_grpc_insecure_non_loopback(
|
||||||
security.insecure_non_loopback);
|
security.insecure_non_loopback);
|
||||||
const auto safety = dmgr_.safetyCoordinator().snapshot();
|
const auto safety = dmgr_.safetyManager().snapshot();
|
||||||
response->set_control_service_instance_id(
|
response->set_control_service_instance_id(
|
||||||
safety.service_instance_id);
|
safety.service_instance_id);
|
||||||
response->set_safety_enforcement_mode(
|
response->set_safety_enforcement_mode(
|
||||||
@ -1365,7 +1365,7 @@ grpc::Status gRPCSystemServiceImpl::GetSafetyState(
|
|||||||
return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, scope.error);
|
return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, scope.error);
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto snapshot = dmgr_.safetyCoordinator().snapshot();
|
const auto snapshot = dmgr_.safetyManager().snapshot();
|
||||||
response->set_system_state(
|
response->set_system_state(
|
||||||
toApiSystemAdmissionState(snapshot.system_state));
|
toApiSystemAdmissionState(snapshot.system_state));
|
||||||
response->set_safety_epoch(snapshot.safety_epoch);
|
response->set_safety_epoch(snapshot.safety_epoch);
|
||||||
@ -1486,7 +1486,7 @@ grpc::Status gRPCSystemServiceImpl::RecoverSafetyState(
|
|||||||
auto deadline = cmvr_grpc_call_guard.context().deadline;
|
auto deadline = cmvr_grpc_call_guard.context().deadline;
|
||||||
const auto configured_deadline =
|
const auto configured_deadline =
|
||||||
cmvr::safety::SafetyClock::now() +
|
cmvr::safety::SafetyClock::now() +
|
||||||
dmgr_.safetyCoordinator().config().recovery_timeout;
|
dmgr_.safetyManager().config().recovery_timeout;
|
||||||
if (deadline == cmvr::safety::SafetyClock::time_point::max() ||
|
if (deadline == cmvr::safety::SafetyClock::time_point::max() ||
|
||||||
configured_deadline < deadline) {
|
configured_deadline < deadline) {
|
||||||
deadline = configured_deadline;
|
deadline = configured_deadline;
|
||||||
@ -1528,7 +1528,7 @@ grpc::Status gRPCSystemServiceImpl::RecoverSafetyState(
|
|||||||
}
|
}
|
||||||
|
|
||||||
const auto result =
|
const auto result =
|
||||||
dmgr_.safetyCoordinator().recover(coordinator_request);
|
dmgr_.safetyManager().recover(coordinator_request);
|
||||||
response->set_recovery_id(result.recovery_id);
|
response->set_recovery_id(result.recovery_id);
|
||||||
response->set_result(toApiRecoveryResult(result.result));
|
response->set_result(toApiRecoveryResult(result.result));
|
||||||
response->set_previous_safety_epoch(result.previous_safety_epoch);
|
response->set_previous_safety_epoch(result.previous_safety_epoch);
|
||||||
@ -1544,7 +1544,7 @@ grpc::Status gRPCSystemServiceImpl::RecoverSafetyState(
|
|||||||
header->set_success(success);
|
header->set_success(success);
|
||||||
header->set_command_id(request->recovery_id());
|
header->set_command_id(request->recovery_id());
|
||||||
header->set_service_instance_id(
|
header->set_service_instance_id(
|
||||||
dmgr_.safetyCoordinator().serviceInstanceId());
|
dmgr_.safetyManager().serviceInstanceId());
|
||||||
header->set_safety_epoch(result.current_safety_epoch);
|
header->set_safety_epoch(result.current_safety_epoch);
|
||||||
header->set_execution_state(
|
header->set_execution_state(
|
||||||
success ? cmvr::api::COMMAND_EXECUTION_STATE_COMPLETED
|
success ? cmvr::api::COMMAND_EXECUTION_STATE_COMPLETED
|
||||||
@ -1596,7 +1596,7 @@ grpc::Status gRPCSystemServiceImpl::StopAll(grpc::ServerContext* context,
|
|||||||
grpc::StatusCode::INVALID_ARGUMENT,
|
grpc::StatusCode::INVALID_ARGUMENT,
|
||||||
"StopAll request and response are required");
|
"StopAll request and response are required");
|
||||||
}
|
}
|
||||||
if (dmgr_.safetyCoordinator().config().enforcement_mode !=
|
if (dmgr_.safetyManager().config().enforcement_mode !=
|
||||||
cmvr::safety::EnforcementMode::Legacy) {
|
cmvr::safety::EnforcementMode::Legacy) {
|
||||||
auto deadline = cmvr_grpc_call_guard.context().deadline;
|
auto deadline = cmvr_grpc_call_guard.context().deadline;
|
||||||
const auto configured_deadline =
|
const auto configured_deadline =
|
||||||
@ -1616,7 +1616,7 @@ grpc::Status gRPCSystemServiceImpl::StopAll(grpc::ServerContext* context,
|
|||||||
if (operation_id.empty() && request->has_header()) {
|
if (operation_id.empty() && request->has_header()) {
|
||||||
operation_id = request->header().command_id();
|
operation_id = request->header().command_id();
|
||||||
}
|
}
|
||||||
const auto result = dmgr_.safetyCoordinator().stopAll(
|
const auto result = dmgr_.safetyManager().stopAll(
|
||||||
std::move(operation_id), deadline);
|
std::move(operation_id), deadline);
|
||||||
response->set_operation_id(result.operation_id);
|
response->set_operation_id(result.operation_id);
|
||||||
response->set_previous_safety_epoch(
|
response->set_previous_safety_epoch(
|
||||||
@ -1633,7 +1633,7 @@ grpc::Status gRPCSystemServiceImpl::StopAll(grpc::ServerContext* context,
|
|||||||
header->set_success(result.success);
|
header->set_success(result.success);
|
||||||
header->set_command_id(result.operation_id);
|
header->set_command_id(result.operation_id);
|
||||||
header->set_service_instance_id(
|
header->set_service_instance_id(
|
||||||
dmgr_.safetyCoordinator().serviceInstanceId());
|
dmgr_.safetyManager().serviceInstanceId());
|
||||||
header->set_safety_epoch(result.current_safety_epoch);
|
header->set_safety_epoch(result.current_safety_epoch);
|
||||||
header->set_execution_state(
|
header->set_execution_state(
|
||||||
result.success
|
result.success
|
||||||
@ -1826,7 +1826,7 @@ grpc::Status gRPCSystemServiceImpl::StopAll(grpc::ServerContext* context,
|
|||||||
tracked_media_ids.insert(ids.begin(), ids.end());
|
tracked_media_ids.insert(ids.begin(), ids.end());
|
||||||
};
|
};
|
||||||
merge_tracked_ids(
|
merge_tracked_ids(
|
||||||
cmvr::media::globalMediaSourceHub().trackedSourceIds());
|
cmvr::media::globalMediaSourceManager().trackedSourceIds());
|
||||||
merge_tracked_ids(
|
merge_tracked_ids(
|
||||||
globalCameraPtzActivityRegistry().trackedDeviceIds());
|
globalCameraPtzActivityRegistry().trackedDeviceIds());
|
||||||
merge_tracked_ids(
|
merge_tracked_ids(
|
||||||
@ -1,7 +1,7 @@
|
|||||||
#include "service/grpc/include/media_activity_coordinator.h"
|
#include "service/grpc/server/include/media_activity_coordinator.h"
|
||||||
|
|
||||||
#include "common/base/logging/logger.h"
|
#include "common/base/logging/logger.h"
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/grpc/include/motor_activity_coordinator.h"
|
#include "service/grpc/server/include/motor_activity_coordinator.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/grpc/include/camera_operational_activity_registry.h"
|
#include "service/grpc/server/include/camera_operational_activity_registry.h"
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
namespace {
|
namespace {
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/grpc/include/camera_ptz_activity_registry.h"
|
#include "service/grpc/server/include/camera_ptz_activity_registry.h"
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
namespace {
|
namespace {
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/grpc/include/grpc_agv_service.h"
|
#include "service/grpc/server/include/grpc_agv_service.h"
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <future>
|
#include <future>
|
||||||
@ -11,9 +11,9 @@
|
|||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
#include "cmvr/config/device_manager_config/device_manager_config.pb.h"
|
#include "cmvr/config/device_manager_config/device_manager_config.pb.h"
|
||||||
#include "manager/control_authority/include/control_authority_manager.h"
|
#include "manager/control_authority_manager/include/control_authority_manager.h"
|
||||||
#include "manager/device_manager/include/device_manager.h"
|
#include "manager/device_manager/include/device_manager.h"
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
namespace {
|
namespace {
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/grpc/include/grpc_arm_service.h"
|
#include "service/grpc/server/include/grpc_arm_service.h"
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
@ -20,10 +20,10 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "cmvr/config/device_manager_config/device_manager_config.pb.h"
|
#include "cmvr/config/device_manager_config/device_manager_config.pb.h"
|
||||||
#include "manager/control_authority/include/control_authority_manager.h"
|
#include "manager/control_authority_manager/include/control_authority_manager.h"
|
||||||
#include "manager/device_manager/include/device_manager.h"
|
#include "manager/device_manager/include/device_manager.h"
|
||||||
#include "service/grpc/include/grpc_error_logging_interceptor.h"
|
#include "service/grpc/server/include/grpc_error_logging_interceptor.h"
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
namespace {
|
namespace {
|
||||||
@ -599,7 +599,7 @@ protected:
|
|||||||
header->set_command_id(command_id);
|
header->set_command_id(command_id);
|
||||||
header->set_expected_service_instance_id(
|
header->set_expected_service_instance_id(
|
||||||
device::DeviceManager::getInstance()
|
device::DeviceManager::getInstance()
|
||||||
.safetyCoordinator()
|
.safetyManager()
|
||||||
.serviceInstanceId());
|
.serviceInstanceId());
|
||||||
header->set_valid_for_ms(1000);
|
header->set_valid_for_ms(1000);
|
||||||
request.mutable_target()->add_position(position);
|
request.mutable_target()->add_position(position);
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/grpc/include/grpc_arm_teleop_service.h"
|
#include "service/grpc/server/include/grpc_arm_teleop_service.h"
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@ -17,9 +17,9 @@
|
|||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "manager/safety/include/device_safety_endpoint.h"
|
#include "manager/safety_manager/include/device_safety_endpoint.h"
|
||||||
#include "manager/safety/include/safety_coordinator.h"
|
#include "manager/safety_manager/include/safety_manager.h"
|
||||||
#include "service/stop_all/include/stop_all_admission_gate.h"
|
#include "service/grpc/stop_all/include/stop_all_admission_gate.h"
|
||||||
|
|
||||||
namespace cmvr::service {
|
namespace cmvr::service {
|
||||||
namespace {
|
namespace {
|
||||||
@ -338,10 +338,10 @@ class TeleopServerHarness final {
|
|||||||
public:
|
public:
|
||||||
explicit TeleopServerHarness(
|
explicit TeleopServerHarness(
|
||||||
std::shared_ptr<ArmTeleopBackend> backend,
|
std::shared_ptr<ArmTeleopBackend> backend,
|
||||||
safety::SafetyCoordinator* safety_coordinator = nullptr)
|
safety::SafetyManager* safety_manager = nullptr)
|
||||||
: service_(
|
: service_(
|
||||||
std::move(backend), nullptr, nullptr,
|
std::move(backend), nullptr, nullptr,
|
||||||
safety_coordinator)
|
safety_manager)
|
||||||
{
|
{
|
||||||
socket_path_ =
|
socket_path_ =
|
||||||
"/tmp/cmvr_arm_teleop_service_test_" +
|
"/tmp/cmvr_arm_teleop_service_test_" +
|
||||||
@ -862,9 +862,9 @@ TEST(ArmTeleopServiceTest,
|
|||||||
TEST(ArmTeleopServiceTest,
|
TEST(ArmTeleopServiceTest,
|
||||||
CoordinatorInvalidationStopsExistingSessionBeforeAnotherSetpoint)
|
CoordinatorInvalidationStopsExistingSessionBeforeAnotherSetpoint)
|
||||||
{
|
{
|
||||||
safety::SafetyCoordinatorConfig config;
|
safety::SafetyManagerConfig config;
|
||||||
config.enforcement_mode = safety::EnforcementMode::EnforceAll;
|
config.enforcement_mode = safety::EnforcementMode::EnforceAll;
|
||||||
safety::SafetyCoordinator coordinator(config);
|
safety::SafetyManager coordinator(config);
|
||||||
auto endpoint = std::make_shared<FakeTeleopSafetyEndpoint>();
|
auto endpoint = std::make_shared<FakeTeleopSafetyEndpoint>();
|
||||||
ASSERT_TRUE(coordinator.registerDevice(
|
ASSERT_TRUE(coordinator.registerDevice(
|
||||||
{endpoint->descriptor(), endpoint, {}}));
|
{endpoint->descriptor(), endpoint, {}}));
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#include "service/grpc/include/grpc_camera_stream_policy.h"
|
#include "service/grpc/server/include/grpc_camera_stream_policy.h"
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user