From 0d56a8e22a264f996fc73f7d4aa6a35adad2e0b0 Mon Sep 17 00:00:00 2001 From: Annie_wang Date: Mon, 30 Jan 2023 18:04:37 +0800 Subject: [PATCH] update docs Signed-off-by: Annie_wang --- en/readme/distributed-hardware.md | 49 ++++++++++++++++++ .../distributed-hardware-subsystem.png | Bin 0 -> 19736 bytes 2 files changed, 49 insertions(+) create mode 100644 en/readme/distributed-hardware.md create mode 100644 en/readme/figures/distributed-hardware-subsystem.png diff --git a/en/readme/distributed-hardware.md b/en/readme/distributed-hardware.md new file mode 100644 index 0000000000..1da23097f8 --- /dev/null +++ b/en/readme/distributed-hardware.md @@ -0,0 +1,49 @@ +# Distributed Hardware + +## Introduction + +### **Distributed Hardware Subsystem** + +The distributed hardware subsystem manages hardware information of all the devices in a Super Device so that the hardware capabilities can be shared and called across devices. + +### Architecture + +![Distributed Hardware Subsystem](figures/distributed-hardware-subsystem.png) + +## Directory Structure + +``` +foundation/distributedhardware +├──device_manager # Directory of DeviceManager. +├──distributed_hardware_fwk # Directory of the distributed hardware framework. +├──distributed_camera # Directory of the distributed camera component. +└──distributed_screen # Directory of the distributed screen component. +``` + +## Component Description + +### DeviceManager + +DeviceManager provides authentication and networking for devices of a Super Device, including discovering distributed devices, performing authentication, and listening for device online/offline status. + +### Distributed Hardware Framework + +As an information management component of the distributed hardware subsystem, the distributed hardware framework implements unified hardware access, information query, and hardware enablement. + +### Distributed Camera + +The distributed camera component implements collaboration of cameras of multiple devices that form a Super Device. Instead of directly interacting with applications, the distributed camera component only provides C++ interfaces for the distributed hardware framework. Applications can call the APIs of the camera framework to use the distributed camera component to operate cameras of other devices, just like operating a local camera. + +### Distributed Screen + +The distributed screen provides a screen virtualization capability, which allows the screen of another authenticated device to be used as a display. In the distributed hardware subsystem, the distributed screen component implements system projection, screen mirroring, and screen splitting across the devices that form a Super Device. + +## Repositories Involved + +[distributedhardware\_device\_manager](https://gitee.com/openharmony/distributedhardware_device_manager) + +[distributedhardware\_distributed\_hardware\_fwk](https://gitee.com/openharmony/distributedhardware_distributed_hardware_fwk) + +[distributedhardware\_distributed\_camera](https://gitee.com/openharmony/distributedhardware_distributed_camera) + +[distributedhardware\_distributed\_screen](https://gitee.com/openharmony/distributedhardware_distributed_screen) diff --git a/en/readme/figures/distributed-hardware-subsystem.png b/en/readme/figures/distributed-hardware-subsystem.png new file mode 100644 index 0000000000000000000000000000000000000000..3c6037bb40688c913f1848a2b5f6fe2ad5517fa1 GIT binary patch literal 19736 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 literal 0 HcmV?d00001 -- GitLab