From 29e8ebdcf10040676915ab613c1d94b5fd24d6b6 Mon Sep 17 00:00:00 2001 From: su Date: Thu, 20 Aug 2026 11:31:27 +0800 Subject: [PATCH] chore: refresh face package docs and samples --- Documentation~/README_UI.md | 39 +++++- Documentation~/README_UI.zh-CN.md | 39 +++++- Documentation~/SDK_API_Reference.md | 20 +++- Documentation~/SDK_API_Reference.zh-CN.md | 20 +++- Documentation~/SDK_Configuration.md | 41 ++++--- Documentation~/SDK_Configuration.zh-CN.md | 49 ++++---- Documentation~/SDK_License_Request.md | 73 ------------ Documentation~/SDK_License_Request.md.meta | 7 -- Documentation~/SDK_License_Request.zh-CN.md | 73 ------------ .../SDK_License_Request.zh-CN.md.meta | 7 -- Documentation~/SDK_Mock_And_Testing.md | 22 ++-- Documentation~/SDK_Mock_And_Testing.zh-CN.md | 22 ++-- Documentation~/SDK_QuickStart.md | 112 +++++++++++------- Documentation~/SDK_QuickStart.zh-CN.md | 112 +++++++++++------- Editor/Aisu.SIM1.Face.Editor.dll | Bin 19456 -> 17920 bytes README.md | 60 +++++----- README.zh-CN.md | 58 +++++---- .../AISU/SI-M1 Face SDK/FaceSdkSettings.asset | 1 + Runtime/Aisu.SIM1.Face.Runtime.dll | Bin 108032 -> 118784 bytes Samples~.meta => Samples.meta | 0 .../Face Detection Demo.meta | 0 ...SIM1.Face.Samples.FaceDetectionDemo.asmdef | 0 ...Face.Samples.FaceDetectionDemo.asmdef.meta | 0 .../Face Detection Demo/README.md | 4 +- .../Face Detection Demo/README.md.meta | 0 .../Face Detection Demo/Scenes.meta | 0 .../Scenes/FaceDetectionDemo.unity | 0 .../Scenes/FaceDetectionDemo.unity.meta | 0 .../Face Detection Demo/Scripts.meta | 0 .../Scripts/FaceDetectionDemoBootstrap.cs | 0 .../FaceDetectionDemoBootstrap.cs.meta | 0 .../Scripts/FaceDetectionDemoCamera.cs | 0 .../Scripts/FaceDetectionDemoCamera.cs.meta | 0 .../Scripts/FaceDetectionDemoController.cs | 15 ++- .../FaceDetectionDemoController.cs.meta | 0 .../Scripts/FaceDetectionDemoLogger.cs | 0 .../Scripts/FaceDetectionDemoLogger.cs.meta | 0 .../Scripts/FaceDetectionDemoUserList.cs | 0 .../Scripts/FaceDetectionDemoUserList.cs.meta | 0 {Samples~ => Samples}/SI-M1 Face Demo.meta | 0 .../Aisu.SIM1.Face.Samples.asmdef | 0 .../Aisu.SIM1.Face.Samples.asmdef.meta | 0 .../SI-M1 Face Demo/Scenes.meta | 0 .../Scenes/FaceModuleDemo.unity | 0 .../Scenes/FaceModuleDemo.unity.meta | 0 .../SI-M1 Face Demo/Scripts.meta | 0 .../SI-M1 Face Demo/Scripts/Core.meta | 0 .../Scripts/Core/FaceModuleKeyboardTester.cs | 12 +- .../Core/FaceModuleKeyboardTester.cs.meta | 0 {Samples~ => Samples}/SI-M1 Face Demo/UI.meta | 0 .../SI-M1 Face Demo/UI/Common.meta | 0 .../UI/Common/FaceModuleDemoBootstrap.cs | 0 .../UI/Common/FaceModuleDemoBootstrap.cs.meta | 0 .../UI/Common/FaceModuleUiCommon.cs | 0 .../UI/Common/FaceModuleUiCommon.cs.meta | 0 .../SI-M1 Face Demo/UI/Pages.meta | 0 .../UI/Pages/FaceModuleAdvancedPages.cs | 0 .../UI/Pages/FaceModuleAdvancedPages.cs.meta | 0 .../UI/Pages/FaceModulePages.cs | 27 ++--- .../UI/Pages/FaceModulePages.cs.meta | 0 .../SI-M1 Face Demo/UI/ViewModels.meta | 0 .../UI/ViewModels/FaceModuleViewModels.cs | 0 .../ViewModels/FaceModuleViewModels.cs.meta | 0 Samples~/SI-M1 Face Demo/Editor.meta | 8 -- .../Aisu.SIM1.Face.Samples.Editor.asmdef | 19 --- .../Aisu.SIM1.Face.Samples.Editor.asmdef.meta | 7 -- .../Editor/FaceModuleDemoSceneGenerator.cs | 39 ------ .../FaceModuleDemoSceneGenerator.cs.meta | 11 -- package.json | 6 +- 69 files changed, 406 insertions(+), 497 deletions(-) delete mode 100644 Documentation~/SDK_License_Request.md delete mode 100644 Documentation~/SDK_License_Request.md.meta delete mode 100644 Documentation~/SDK_License_Request.zh-CN.md delete mode 100644 Documentation~/SDK_License_Request.zh-CN.md.meta rename Samples~.meta => Samples.meta (100%) rename {Samples~ => Samples}/Face Detection Demo.meta (100%) rename {Samples~ => Samples}/Face Detection Demo/Aisu.SIM1.Face.Samples.FaceDetectionDemo.asmdef (100%) rename {Samples~ => Samples}/Face Detection Demo/Aisu.SIM1.Face.Samples.FaceDetectionDemo.asmdef.meta (100%) rename {Samples~ => Samples}/Face Detection Demo/README.md (90%) rename {Samples~ => Samples}/Face Detection Demo/README.md.meta (100%) rename {Samples~ => Samples}/Face Detection Demo/Scenes.meta (100%) rename {Samples~ => Samples}/Face Detection Demo/Scenes/FaceDetectionDemo.unity (100%) rename {Samples~ => Samples}/Face Detection Demo/Scenes/FaceDetectionDemo.unity.meta (100%) rename {Samples~ => Samples}/Face Detection Demo/Scripts.meta (100%) rename {Samples~ => Samples}/Face Detection Demo/Scripts/FaceDetectionDemoBootstrap.cs (100%) rename {Samples~ => Samples}/Face Detection Demo/Scripts/FaceDetectionDemoBootstrap.cs.meta (100%) rename {Samples~ => Samples}/Face Detection Demo/Scripts/FaceDetectionDemoCamera.cs (100%) rename {Samples~ => Samples}/Face Detection Demo/Scripts/FaceDetectionDemoCamera.cs.meta (100%) rename {Samples~ => Samples}/Face Detection Demo/Scripts/FaceDetectionDemoController.cs (98%) rename {Samples~ => Samples}/Face Detection Demo/Scripts/FaceDetectionDemoController.cs.meta (100%) rename {Samples~ => Samples}/Face Detection Demo/Scripts/FaceDetectionDemoLogger.cs (100%) rename {Samples~ => Samples}/Face Detection Demo/Scripts/FaceDetectionDemoLogger.cs.meta (100%) rename {Samples~ => Samples}/Face Detection Demo/Scripts/FaceDetectionDemoUserList.cs (100%) rename {Samples~ => Samples}/Face Detection Demo/Scripts/FaceDetectionDemoUserList.cs.meta (100%) rename {Samples~ => Samples}/SI-M1 Face Demo.meta (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/Aisu.SIM1.Face.Samples.asmdef (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/Aisu.SIM1.Face.Samples.asmdef.meta (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/Scenes.meta (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/Scenes/FaceModuleDemo.unity (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/Scenes/FaceModuleDemo.unity.meta (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/Scripts.meta (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/Scripts/Core.meta (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/Scripts/Core/FaceModuleKeyboardTester.cs (99%) rename {Samples~ => Samples}/SI-M1 Face Demo/Scripts/Core/FaceModuleKeyboardTester.cs.meta (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/UI.meta (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/UI/Common.meta (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/UI/Common/FaceModuleDemoBootstrap.cs (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/UI/Common/FaceModuleDemoBootstrap.cs.meta (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/UI/Common/FaceModuleUiCommon.cs (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/UI/Common/FaceModuleUiCommon.cs.meta (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/UI/Pages.meta (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/UI/Pages/FaceModuleAdvancedPages.cs (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/UI/Pages/FaceModuleAdvancedPages.cs.meta (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/UI/Pages/FaceModulePages.cs (98%) rename {Samples~ => Samples}/SI-M1 Face Demo/UI/Pages/FaceModulePages.cs.meta (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/UI/ViewModels.meta (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/UI/ViewModels/FaceModuleViewModels.cs (100%) rename {Samples~ => Samples}/SI-M1 Face Demo/UI/ViewModels/FaceModuleViewModels.cs.meta (100%) delete mode 100644 Samples~/SI-M1 Face Demo/Editor.meta delete mode 100644 Samples~/SI-M1 Face Demo/Editor/Aisu.SIM1.Face.Samples.Editor.asmdef delete mode 100644 Samples~/SI-M1 Face Demo/Editor/Aisu.SIM1.Face.Samples.Editor.asmdef.meta delete mode 100644 Samples~/SI-M1 Face Demo/Editor/FaceModuleDemoSceneGenerator.cs delete mode 100644 Samples~/SI-M1 Face Demo/Editor/FaceModuleDemoSceneGenerator.cs.meta diff --git a/Documentation~/README_UI.md b/Documentation~/README_UI.md index 7ada464..a34d1f0 100644 --- a/Documentation~/README_UI.md +++ b/Documentation~/README_UI.md @@ -2,12 +2,41 @@ 中文说明见 [README_UI.zh-CN.md](README_UI.zh-CN.md). -The public DLL-only UPM package does not include Demo UI source files or importable sample scenes. - -Use the SDK from your own Unity scene by creating a `FaceModuleManager` through: +## Scenes ```text -AISU/SI-M1 Face SDK/Create Manager GameObject +Packages/xin.aisu.si-m1.face/Samples/SI-M1 Face Demo/Scenes/FaceModuleDemo.unity +Packages/xin.aisu.si-m1.face/Samples/Face Detection Demo/Scenes/FaceDetectionDemo.unity ``` -For Demo UI source, sample scenes, or internal validation tests, use the private development SDK repository. +## SI-M1 Face Demo + +This scene covers the main SDK commands: + +- Connection and basic status +- Protocol debug +- Face verification +- Face enrollment +- User management +- QR code +- Image capture +- Photo and feature enrollment +- Feature management +- UVC settings +- Advanced settings + +## Face Detection Demo + +This scene provides a compact workflow for: + +- Camera enumeration and preview +- Serial port selection +- Module connection and disconnection +- Face enrollment +- Face verification +- User list refresh and deletion +- Operation log display + +## Mock Mode + +Enable `Use Mock In Editor` in `FaceSdkSettings` to test UI flow without real SI-M1 hardware. diff --git a/Documentation~/README_UI.zh-CN.md b/Documentation~/README_UI.zh-CN.md index 1793484..ffa0c95 100644 --- a/Documentation~/README_UI.zh-CN.md +++ b/Documentation~/README_UI.zh-CN.md @@ -2,12 +2,41 @@ English documentation: [README_UI.md](README_UI.md). -公开 DLL-only UPM 包不包含 Demo UI 源码,也不包含可导入的示例场景。 - -请在自己的 Unity 场景中通过以下菜单创建 `FaceModuleManager`: +## 场景 ```text -AISU/SI-M1 Face SDK/Create Manager GameObject +Packages/xin.aisu.si-m1.face/Samples/SI-M1 Face Demo/Scenes/FaceModuleDemo.unity +Packages/xin.aisu.si-m1.face/Samples/Face Detection Demo/Scenes/FaceDetectionDemo.unity ``` -如需 Demo UI 源码、示例场景或内部验证测试,请使用私有开发 SDK 仓库。 +## SI-M1 Face Demo + +该场景覆盖主要 SDK 命令: + +- 连接和基础状态 +- 协议调试 +- 人脸验证 +- 人脸录入 +- 用户管理 +- 二维码 +- 图片抓拍 +- 照片和特征录入 +- 特征管理 +- UVC 设置 +- 高级设置 + +## Face Detection Demo + +该场景提供最小测试流程: + +- 摄像头枚举和预览 +- 串口选择 +- 模组连接和断开 +- 人脸录入 +- 人脸验证 +- 用户列表刷新和删除 +- 操作日志显示 + +## Mock 模式 + +在 `FaceSdkSettings` 中启用 `Use Mock In Editor`,可以在没有真实 SI-M1 硬件时测试 UI 流程。 diff --git a/Documentation~/SDK_API_Reference.md b/Documentation~/SDK_API_Reference.md index 6630eab..bfa970d 100644 --- a/Documentation~/SDK_API_Reference.md +++ b/Documentation~/SDK_API_Reference.md @@ -2,7 +2,7 @@ 中文说明见 [SDK_API_Reference.zh-CN.md](SDK_API_Reference.zh-CN.md). -This document lists the public business-level API exposed by `xin.aisu.si-m1.face`. The package is DLL-only; source files are not included in the public release. +This document lists the business-level API exposed by `xin.aisu.si-m1.face`. ## Namespaces @@ -52,7 +52,11 @@ using Aisu.SIM1.Face.Core; | `Configure(bool useMockInEditor, string portName, int baudRate)` | Quick configuration for legacy code | | `ApplySettings(FaceSdkSettings sdkSettings)` | Apply ScriptableObject settings and rebuild transport | | `Open()` | Open transport | -| `Close()` | Close transport | +| `Close()` | Stop active face operations and close transport | +| `CloseAsync()` | Stop active face operations and close transport asynchronously | +| `StopFaceOperationAsync()` | Stop auto verify or reset the current face flow | +| `StartAutoVerifyAsync(byte timeout)` | Start auto verify and return the control command result | +| `StopAutoVerifyAsync(byte timeout = 1)` | Stop auto verify and return the control command result | | `WaitReadyAsync(int timeoutMs = 5000)` | Wait for READY note | | `ProbeReadyByStatusAsync()` | Query status and mark manager ready | | `SendRawBytes(byte[] bytes)` | Send raw protocol bytes | @@ -67,6 +71,7 @@ using Aisu.SIM1.Face.Core; | `OnReplyReceived(FaceReply)` | REPLY packet received | | `OnNoteReceived(FaceNote)` | NOTE packet received | | `OnFaceStateUpdated(FaceFaceStateNote)` | Face state NOTE received | +| `OnAutoVerifyResult(FaceAutoVerifyResult)` | Auto verify result NOTE received | | `OnQrCodeReceived(string)` | QR code NOTE received | | `OnFeatureReceived(byte[])` | Feature data packet received | | `OnDataPacketReceived(FacePacket)` | Image/template data packet received | @@ -96,7 +101,9 @@ Access path: `manager.Verify` | Method | Return | Description | |---|---|---| | `VerifyAsync(byte timeout, byte maxRecognitionTimes = 30)` | `Task` | Run one face verification | -| `AutoVerifyAsync(bool enable, byte timeout)` | `Task` | Enable or disable automatic verification | +| `AutoVerifyAsync(bool enable, byte timeout)` | `Task` | Low-level auto verify control command | + +For application code, prefer `FaceModuleManager.StartAutoVerifyAsync()` and `FaceModuleManager.StopAutoVerifyAsync()`. Recognition results are delivered through `OnAutoVerifyResult`. ### FaceEnrollmentService @@ -205,6 +212,7 @@ Callbacks use a consistent pattern: | `Configure(bool useMockInEditor, string portName, int baudRate, Action success, Action error)` | `Action` | Configure default transport parameters | | `Open(Action success, Action error)` | `Action` | Open transport | | `Close(Action success, Action error)` | `Action` | Close transport | +| `StopFaceOperation(Action success, Action error)` | `Action` | Stop auto verify or reset current face flow | | `SendRawBytes(byte[] bytes, Action success, Action error)` | `Action` | Send raw bytes | | `WaitReady(int timeoutMs, Action success, Action error)` | `Action` | Wait for READY | | `ProbeReadyByStatus(Action success, Action error)` | `Action` | Probe status and mark ready | @@ -226,7 +234,9 @@ Callbacks use a consistent pattern: | Method | Success Callback | Description | |---|---|---| | `Verify(byte timeout, Action success, Action error, byte maxRecognitionTimes = 30)` | `Action` | Run face verification | -| `AutoVerify(bool enable, byte timeout, Action success, Action error)` | `Action` | Enable or disable auto verification | +| `AutoVerify(bool enable, byte timeout, Action success, Action error)` | `Action` | Low-level auto verify control command | +| `StartAutoVerify(byte timeout, Action success, Action error)` | `Action` | Start auto verify | +| `StopAutoVerify(byte timeout, Action success, Action error)` | `Action` | Stop auto verify | | `Enroll(bool admin, string userName, FaceDirection direction, byte timeout, Action success, Action error)` | `Action` | Interactive enrollment | | `EnrollSingle(bool admin, string userName, byte timeout, Action success, Action error)` | `Action` | Single-frame enrollment | | `EnrollIntegrated(bool admin, string userName, FaceDirection direction, byte timeout, bool singleFrame, bool duplicateCheck, Action success, Action error)` | `Action` | Integrated enrollment | @@ -280,6 +290,8 @@ Callbacks use a consistent pattern: | `FaceReply` | REPLY packet parse result | | `FaceNote` | NOTE packet parse result | | `FaceFaceStateNote` | Face state NOTE | +| `FaceAutoVerifyResult` | Auto verify recognition result | +| `FaceAutoVerifyControlResult` | Auto verify start/stop command result | | `FaceUserInfo` | User ID, name, and admin flag | | `FaceVerifyResult` | Verification result, user info, unlock status | | `FaceEnrollResult` | Enrollment result, user ID, direction | diff --git a/Documentation~/SDK_API_Reference.zh-CN.md b/Documentation~/SDK_API_Reference.zh-CN.md index 1aa47ea..56accc0 100644 --- a/Documentation~/SDK_API_Reference.zh-CN.md +++ b/Documentation~/SDK_API_Reference.zh-CN.md @@ -2,7 +2,7 @@ English documentation: [SDK_API_Reference.md](SDK_API_Reference.md). -本文列出 `xin.aisu.si-m1.face` 对外公开的业务层 API。公开包为 DLL-only 形式,不包含 SDK 源码。 +本文列出 `xin.aisu.si-m1.face` 的业务层 API。 ## 命名空间 @@ -52,7 +52,11 @@ using Aisu.SIM1.Face.Core; | `Configure(bool useMockInEditor, string portName, int baudRate)` | 兼容旧代码的快速配置入口 | | `ApplySettings(FaceSdkSettings sdkSettings)` | 应用 ScriptableObject 配置并重建 transport | | `Open()` | 打开通信 | -| `Close()` | 关闭通信 | +| `Close()` | 停止当前人脸流程并关闭通信 | +| `CloseAsync()` | 异步停止当前人脸流程并关闭通信 | +| `StopFaceOperationAsync()` | 停止自动验证或重置当前人脸流程 | +| `StartAutoVerifyAsync(byte timeout)` | 开启自动验证并返回控制命令结果 | +| `StopAutoVerifyAsync(byte timeout = 1)` | 关闭自动验证并返回控制命令结果 | | `WaitReadyAsync(int timeoutMs = 5000)` | 等待 READY NOTE | | `ProbeReadyByStatusAsync()` | 主动查询状态并标记 READY | | `SendRawBytes(byte[] bytes)` | 发送原始协议 bytes | @@ -67,6 +71,7 @@ using Aisu.SIM1.Face.Core; | `OnReplyReceived(FaceReply)` | 收到 REPLY 包 | | `OnNoteReceived(FaceNote)` | 收到 NOTE 包 | | `OnFaceStateUpdated(FaceFaceStateNote)` | 收到人脸状态 NOTE | +| `OnAutoVerifyResult(FaceAutoVerifyResult)` | 收到自动验证结果 NOTE | | `OnQrCodeReceived(string)` | 收到二维码 NOTE | | `OnFeatureReceived(byte[])` | 收到特征数据包 | | `OnDataPacketReceived(FacePacket)` | 收到图片或模板数据包 | @@ -96,7 +101,9 @@ using Aisu.SIM1.Face.Core; | 方法 | 返回 | 说明 | |---|---|---| | `VerifyAsync(byte timeout, byte maxRecognitionTimes = 30)` | `Task` | 单次人脸验证 | -| `AutoVerifyAsync(bool enable, byte timeout)` | `Task` | 启用或关闭自动验证 | +| `AutoVerifyAsync(bool enable, byte timeout)` | `Task` | 底层自动验证控制命令 | + +业务代码推荐使用 `FaceModuleManager.StartAutoVerifyAsync()` 和 `FaceModuleManager.StopAutoVerifyAsync()`。识别结果通过 `OnAutoVerifyResult` 获取。 ### FaceEnrollmentService @@ -205,6 +212,7 @@ public interface IFaceModuleCrypto | `Configure(bool useMockInEditor, string portName, int baudRate, Action success, Action error)` | `Action` | 配置默认通信参数 | | `Open(Action success, Action error)` | `Action` | 打开通信 | | `Close(Action success, Action error)` | `Action` | 关闭通信 | +| `StopFaceOperation(Action success, Action error)` | `Action` | 停止自动验证或重置当前人脸流程 | | `SendRawBytes(byte[] bytes, Action success, Action error)` | `Action` | 发送原始 bytes | | `WaitReady(int timeoutMs, Action success, Action error)` | `Action` | 等待 READY | | `ProbeReadyByStatus(Action success, Action error)` | `Action` | 主动探测状态并标记 READY | @@ -226,7 +234,9 @@ public interface IFaceModuleCrypto | 方法 | 成功回调 | 说明 | |---|---|---| | `Verify(byte timeout, Action success, Action error, byte maxRecognitionTimes = 30)` | `Action` | 人脸验证 | -| `AutoVerify(bool enable, byte timeout, Action success, Action error)` | `Action` | 启用或关闭自动验证 | +| `AutoVerify(bool enable, byte timeout, Action success, Action error)` | `Action` | 底层自动验证控制命令 | +| `StartAutoVerify(byte timeout, Action success, Action error)` | `Action` | 开启自动验证 | +| `StopAutoVerify(byte timeout, Action success, Action error)` | `Action` | 关闭自动验证 | | `Enroll(bool admin, string userName, FaceDirection direction, byte timeout, Action success, Action error)` | `Action` | 交互式录入 | | `EnrollSingle(bool admin, string userName, byte timeout, Action success, Action error)` | `Action` | 单帧录入 | | `EnrollIntegrated(bool admin, string userName, FaceDirection direction, byte timeout, bool singleFrame, bool duplicateCheck, Action success, Action error)` | `Action` | 集成式录入 | @@ -280,6 +290,8 @@ public interface IFaceModuleCrypto | `FaceReply` | REPLY 包解析结果 | | `FaceNote` | NOTE 包解析结果 | | `FaceFaceStateNote` | 人脸状态 NOTE | +| `FaceAutoVerifyResult` | 自动验证识别结果 | +| `FaceAutoVerifyControlResult` | 自动验证开启/关闭命令结果 | | `FaceUserInfo` | 用户 ID、姓名、管理员标记 | | `FaceVerifyResult` | 验证结果、用户信息、开锁状态 | | `FaceEnrollResult` | 录入结果、用户 ID、方向 | diff --git a/Documentation~/SDK_Configuration.md b/Documentation~/SDK_Configuration.md index 66c276c..f4060d1 100644 --- a/Documentation~/SDK_Configuration.md +++ b/Documentation~/SDK_Configuration.md @@ -2,17 +2,15 @@ 中文说明见 [SDK_Configuration.zh-CN.md](SDK_Configuration.zh-CN.md). -The SDK uses `FaceSdkSettings` as the recommended configuration asset. It is a `ScriptableObject` created inside the importing Unity project and can be synchronized to scene `FaceModuleManager` instances. +The SDK uses `FaceSdkSettings` as the recommended configuration asset. `FaceModuleManager` can read this asset and synchronize the values into its runtime config. ## Default Settings Asset -Default path in the importing Unity project: - ```text -Assets/AISU/SI-M1 Face SDK/FaceSdkSettings.asset +Assets/Resources/AISU/SI-M1 Face SDK/FaceSdkSettings.asset ``` -Open `AISU/SI-M1 Face SDK/Settings` to load or create this asset. +Open `AISU/SI-M1 Face SDK/Settings` to load, edit, and save the asset. ## FaceSdkSettings Fields @@ -20,14 +18,19 @@ Open `AISU/SI-M1 Face SDK/Settings` to load or create this asset. |---|---|---| | `TransportMode` | `FaceTransportMode` | `Auto`, `SerialPort`, or `Mock` | | `UseMockInEditor` | `bool` | Force mock transport in Unity Editor | -| `PortName` | `string` | Runtime/player serial port | -| `BaudRate` | `int` | Runtime/player baud rate | -| `ReadBufferSize` | `int` | Runtime/player read buffer size | +| `PortName` | `string` | Runtime serial port | +| `BaudRate` | `int` | Runtime baud rate | +| `ReadBufferSize` | `int` | Runtime read buffer size | | `UseEditorSerialDebugParameters` | `bool` | Use separate serial parameters in Editor | | `EditorPortName` | `string` | Editor debug serial port | | `EditorBaudRate` | `int` | Editor debug baud rate | | `EditorReadBufferSize` | `int` | Editor debug read buffer size | | `MockResponseDelayFrames` | `int` | Mock response delay in frames | +| `AutoVerifyOnOpen` | `bool` | Start auto verify after READY | +| `AutoVerifyTimeout` | `byte` | Auto verify protocol timeout in seconds | +| `AutoVerifyResultIntervalMs` | `int` | Minimum interval between auto verify result events | +| `StopAutoVerifyBeforeExclusiveCommand` | `bool` | Stop auto verify before exclusive commands | +| `ExclusiveCommandPolicy` | `FaceExclusiveCommandPolicy` | Policy when exclusive commands run during auto verify | | `DebugLogEnabled` | `bool` | Enable SDK debug logs | | `RawLogEnabled` | `bool` | Dispatch raw TX/RX logs | | `LogPrefix` | `string` | Log prefix | @@ -40,37 +43,33 @@ Open `AISU/SI-M1 Face SDK/Settings` to load or create this asset. | `SerialPort` | Use `SerialPortTransport` | | `Mock` | Use `MockFaceModuleTransport` | -When `UseMockInEditor = true`, the Editor always uses mock transport and does not open a real serial port. +When `UseMockInEditor = true`, the Editor uses mock transport and does not open a real serial port. -## Editor Tools +## Auto Verify -| Menu | Purpose | -|---|---| -| `AISU/SI-M1 Face SDK/Settings` | Open SDK settings window | -| `AISU/SI-M1 Face SDK/Create Manager GameObject` | Create or update one scene `FaceModuleManager` | -| `AISU/SI-M1 Face SDK/Open Diagnostics` | Open diagnostics window | +`AutoVerifyTimeout` is sent to the SI-M1 module as the recognition timeout. -The public DLL-only package does not include importable demo samples. Any demo-related menu item should be treated as unavailable in the public release if it appears in the current Editor DLL. +`AutoVerifyResultIntervalMs` is handled by the Unity SDK. It limits how frequently `OnAutoVerifyResult` is dispatched when the module sends continuous auto verify NOTE packets. Set it to `0` to dispatch every result. -## Recommended Usage +`StopAutoVerifyBeforeExclusiveCommand` and `ExclusiveCommandPolicy` control how enrollment, user management, QR code, image capture, and feature operations behave while auto verify is active. + +## Runtime Usage ```csharp manager.ApplySettings(settings); manager.Open(); ``` -Legacy quick configuration: +Quick configuration: ```csharp manager.Configure(useMockInEditor: true, portName: "COM3", baudRate: 115200); manager.Open(); ``` -Custom transport injection: +Custom transport: ```csharp manager.ConfigureTransport(customTransport); manager.Open(); ``` - -Keep only one `FaceModuleManager` in each scene to avoid duplicate serial connections and duplicated events. diff --git a/Documentation~/SDK_Configuration.zh-CN.md b/Documentation~/SDK_Configuration.zh-CN.md index c62605b..44bcf8f 100644 --- a/Documentation~/SDK_Configuration.zh-CN.md +++ b/Documentation~/SDK_Configuration.zh-CN.md @@ -1,33 +1,36 @@ -# SDK 配置 +# SDK 配置说明 English documentation: [SDK_Configuration.md](SDK_Configuration.md). -SDK 推荐使用 `FaceSdkSettings` 作为配置资产。该配置是 `ScriptableObject`,会创建在导入该包的 Unity 项目中,并可同步到场景里的 `FaceModuleManager`。 +SDK 推荐使用 `FaceSdkSettings` 作为配置资产。`FaceModuleManager` 可以读取该资产,并同步到运行时配置。 ## 默认配置资产 -默认路径位于导入该包的 Unity 项目内: - ```text -Assets/AISU/SI-M1 Face SDK/FaceSdkSettings.asset +Assets/Resources/AISU/SI-M1 Face SDK/FaceSdkSettings.asset ``` -打开 `AISU/SI-M1 Face SDK/Settings` 可加载或创建该配置资产。 +打开 `AISU/SI-M1 Face SDK/Settings` 可以加载、编辑和保存配置。 ## FaceSdkSettings 字段 | 字段 | 类型 | 说明 | |---|---|---| | `TransportMode` | `FaceTransportMode` | `Auto`、`SerialPort` 或 `Mock` | -| `UseMockInEditor` | `bool` | Unity Editor 中强制使用 Mock 通信 | -| `PortName` | `string` | Runtime/Player 串口号 | -| `BaudRate` | `int` | Runtime/Player 波特率 | -| `ReadBufferSize` | `int` | Runtime/Player 读取缓冲区大小 | -| `UseEditorSerialDebugParameters` | `bool` | Editor 中是否使用单独串口参数 | +| `UseMockInEditor` | `bool` | Editor 下强制使用 Mock 通信 | +| `PortName` | `string` | 运行时串口号 | +| `BaudRate` | `int` | 运行时波特率 | +| `ReadBufferSize` | `int` | 运行时读取缓冲区 | +| `UseEditorSerialDebugParameters` | `bool` | Editor 下是否使用单独串口参数 | | `EditorPortName` | `string` | Editor 调试串口号 | | `EditorBaudRate` | `int` | Editor 调试波特率 | -| `EditorReadBufferSize` | `int` | Editor 调试读取缓冲区大小 | +| `EditorReadBufferSize` | `int` | Editor 调试读取缓冲区 | | `MockResponseDelayFrames` | `int` | Mock 响应延迟帧数 | +| `AutoVerifyOnOpen` | `bool` | READY 后是否自动开启验证 | +| `AutoVerifyTimeout` | `byte` | 自动验证协议超时时间,单位秒 | +| `AutoVerifyResultIntervalMs` | `int` | 自动验证结果事件最小间隔 | +| `StopAutoVerifyBeforeExclusiveCommand` | `bool` | 独占命令前是否停止自动验证 | +| `ExclusiveCommandPolicy` | `FaceExclusiveCommandPolicy` | 自动验证期间执行独占命令的处理策略 | | `DebugLogEnabled` | `bool` | 是否启用 SDK Debug 日志 | | `RawLogEnabled` | `bool` | 是否派发原始 TX/RX 日志 | | `LogPrefix` | `string` | 日志前缀 | @@ -40,37 +43,33 @@ Assets/AISU/SI-M1 Face SDK/FaceSdkSettings.asset | `SerialPort` | 使用 `SerialPortTransport` | | `Mock` | 使用 `MockFaceModuleTransport` | -当 `UseMockInEditor = true` 时,Editor 会始终使用 Mock 通信,不会打开真实串口。 +当 `UseMockInEditor = true` 时,Editor 使用 Mock 通信,不会打开真实串口。 -## Editor 工具 +## 自动验证 -| 菜单 | 用途 | -|---|---| -| `AISU/SI-M1 Face SDK/Settings` | 打开 SDK 配置窗口 | -| `AISU/SI-M1 Face SDK/Create Manager GameObject` | 创建或更新场景中的唯一 `FaceModuleManager` | -| `AISU/SI-M1 Face SDK/Open Diagnostics` | 打开诊断窗口 | +`AutoVerifyTimeout` 会发送给 SI-M1 模组,表示识别超时时间。 -公开 DLL-only 包不包含可导入 Demo 示例。如果当前 Editor DLL 中仍出现 Demo 相关菜单,应视为公开版本不可用功能。 +`AutoVerifyResultIntervalMs` 由 Unity SDK 处理,用于限制 `OnAutoVerifyResult` 的派发频率。设置为 `0` 时不做节流。 -## 推荐用法 +`StopAutoVerifyBeforeExclusiveCommand` 和 `ExclusiveCommandPolicy` 用于控制自动验证开启时,录入、用户管理、二维码、抓拍、特征等独占操作的行为。 + +## 运行时使用 ```csharp manager.ApplySettings(settings); manager.Open(); ``` -兼容式快速配置: +快速配置: ```csharp manager.Configure(useMockInEditor: true, portName: "COM3", baudRate: 115200); manager.Open(); ``` -自定义通信层注入: +自定义通信层: ```csharp manager.ConfigureTransport(customTransport); manager.Open(); ``` - -每个场景建议只保留一个 `FaceModuleManager`,避免重复打开串口和重复派发事件。 diff --git a/Documentation~/SDK_License_Request.md b/Documentation~/SDK_License_Request.md deleted file mode 100644 index 637a908..0000000 --- a/Documentation~/SDK_License_Request.md +++ /dev/null @@ -1,73 +0,0 @@ -# SI-M1 Face SDK License Request - -This public DLL-only package requires a project-specific license file for real serial-port runtime usage. Mock mode does not require a license. - -## License File Path - -Place the license file at: - -```text -Assets/StreamingAssets/si-m1_face.dat -``` - -The SDK reads this file through `Application.streamingAssetsPath`. - -## Required Unity Binding Parameters - -Provide these values from the Unity project that will run the SDK: - -| Field | Unity Source | -|---|---| -| `identifier` | `Application.identifier` | -| `companyName` | `Application.companyName` | -| `productName` | `Application.productName` | -| `version` | `Application.version` | -| `unityVersion` | `Application.unityVersion` | - -If any of these values changes, the existing license becomes invalid and a new license is required. - -## Parameter Probe - -Add this temporary script to the customer project and copy the Console output when requesting a license: - -```csharp -using UnityEngine; - -public sealed class FaceLicenseParameterPrinter : MonoBehaviour -{ - private void Awake() - { - Debug.Log("identifier=" + Application.identifier); - Debug.Log("companyName=" + Application.companyName); - Debug.Log("productName=" + Application.productName); - Debug.Log("version=" + Application.version); - Debug.Log("unityVersion=" + Application.unityVersion); - } -} -``` - -## Request Information - -Provide: - -| Item | Example | -|---|---| -| Customer name | `customer-a` | -| Project name | `Face App` | -| Unity binding parameters | See above | -| License start time | `2026-08-10T00:00:00+08:00` | -| License expiry time | `2027-08-10T00:00:00+08:00` | -| Licensed features | `SerialRuntime,Basic,Verify,Enroll` | - -License times use Beijing time and must use `yyyy-MM-ddTHH:mm:ss+08:00`. - -## Common Failures - -| Symptom | Cause | -|---|---| -| License file missing | `si-m1_face.dat` is not under `Assets/StreamingAssets` | -| Binding mismatch | One of the Unity binding parameters changed | -| Expired | Current Beijing time is after `expireAt` | -| Not yet valid | Current Beijing time is before `issuedAt` | -| Feature denied | The license does not include the requested SDK feature | -| Invalid signature | The file was modified or does not match this SDK build | diff --git a/Documentation~/SDK_License_Request.md.meta b/Documentation~/SDK_License_Request.md.meta deleted file mode 100644 index 56106cf..0000000 --- a/Documentation~/SDK_License_Request.md.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 7f0d681e6f6b4d6a86f6a989cdf55091 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Documentation~/SDK_License_Request.zh-CN.md b/Documentation~/SDK_License_Request.zh-CN.md deleted file mode 100644 index f7d8b8e..0000000 --- a/Documentation~/SDK_License_Request.zh-CN.md +++ /dev/null @@ -1,73 +0,0 @@ -# SI-M1 Face SDK 授权申请 - -DLL-only 公开包在真实串口运行时需要项目专用授权文件。Mock 模式不需要授权。 - -## 授权文件路径 - -授权文件必须放在客户 Unity 项目中: - -```text -Assets/StreamingAssets/si-m1_face.dat -``` - -SDK 会通过 `Application.streamingAssetsPath` 读取该文件。 - -## 需要提供的 Unity 绑定参数 - -申请授权时需要提供运行 SDK 的 Unity 项目参数: - -| 字段 | Unity 读取来源 | -|---|---| -| `identifier` | `Application.identifier` | -| `companyName` | `Application.companyName` | -| `productName` | `Application.productName` | -| `version` | `Application.version` | -| `unityVersion` | `Application.unityVersion` | - -这些值任意变化后,已有授权会失效,需要重新申请授权。 - -## 参数打印脚本 - -客户可以在项目中临时添加以下脚本,并把 Console 输出发给授权人员: - -```csharp -using UnityEngine; - -public sealed class FaceLicenseParameterPrinter : MonoBehaviour -{ - private void Awake() - { - Debug.Log("identifier=" + Application.identifier); - Debug.Log("companyName=" + Application.companyName); - Debug.Log("productName=" + Application.productName); - Debug.Log("version=" + Application.version); - Debug.Log("unityVersion=" + Application.unityVersion); - } -} -``` - -## 授权申请信息 - -建议提供: - -| 项 | 示例 | -|---|---| -| 客户名称 | `customer-a` | -| 项目名称 | `Face App` | -| Unity 绑定参数 | 见上文 | -| 授权开始时间 | `2026-08-10T00:00:00+08:00` | -| 授权过期时间 | `2027-08-10T00:00:00+08:00` | -| 授权功能 | `SerialRuntime,Basic,Verify,Enroll` | - -授权时间使用北京时间,格式必须为 `yyyy-MM-ddTHH:mm:ss+08:00`。 - -## 常见失败原因 - -| 现象 | 原因 | -|---|---| -| 授权文件不存在 | `si-m1_face.dat` 没有放在 `Assets/StreamingAssets` 下 | -| 授权绑定不匹配 | Unity 绑定参数发生变化 | -| 授权已过期 | 当前北京时间晚于 `expireAt` | -| 授权尚未生效 | 当前北京时间早于 `issuedAt` | -| 功能未授权 | 授权中不包含当前调用的 SDK 功能 | -| 签名无效 | 授权文件被修改,或与当前 SDK 构建不匹配 | diff --git a/Documentation~/SDK_License_Request.zh-CN.md.meta b/Documentation~/SDK_License_Request.zh-CN.md.meta deleted file mode 100644 index 554de2e..0000000 --- a/Documentation~/SDK_License_Request.zh-CN.md.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 9204393b20cb4dd9a9edb6f230fe6d3b -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Documentation~/SDK_Mock_And_Testing.md b/Documentation~/SDK_Mock_And_Testing.md index 64460df..f5a21f8 100644 --- a/Documentation~/SDK_Mock_And_Testing.md +++ b/Documentation~/SDK_Mock_And_Testing.md @@ -2,8 +2,6 @@ 中文说明见 [SDK_Mock_And_Testing.zh-CN.md](SDK_Mock_And_Testing.zh-CN.md). -The public DLL-only package includes runtime mock support inside `Aisu.SIM1.Face.Runtime.dll`, but it does not include EditMode test source files. - ## Editor Mock For Editor integration without real hardware, enable mock mode in `FaceSdkSettings`: @@ -12,7 +10,14 @@ For Editor integration without real hardware, enable mock mode in `FaceSdkSettin Use Mock In Editor = true ``` -When this option is enabled, the SDK uses the built-in mock transport in the Unity Editor instead of opening a real serial port. +When this option is enabled, the SDK uses `MockFaceModuleTransport` in the Unity Editor instead of opening a real serial port. + +Mock mode is useful for: + +- UI flow testing +- Command callback testing +- User-list display testing +- Basic enrollment and verification workflow testing ## Hardware Validation @@ -20,9 +25,12 @@ For real SI-M1 hardware validation: 1. Set `Use Mock In Editor = false`. 2. Configure `Editor Port Name`, `Editor Baud Rate`, and `Editor Read Buffer Size`. -3. Create a `FaceModuleManager` in the scene. -4. Call `Open()`, then wait for `WaitReadyAsync()` or handle `OnReady`. +3. Open the scene that contains one `FaceModuleManager`. +4. Call `Open()`. +5. Wait for `WaitReadyAsync()` or handle `OnReady`. -## Automated Tests +## Logs -Internal EditMode tests are maintained in the private development SDK repository and are not distributed in this DLL-only public package. +Enable `RawLogEnabled` to receive raw TX/RX logs through `OnRawLog`. + +Enable `DebugLogEnabled` to print SDK-level debug logs. diff --git a/Documentation~/SDK_Mock_And_Testing.zh-CN.md b/Documentation~/SDK_Mock_And_Testing.zh-CN.md index d203316..18e2815 100644 --- a/Documentation~/SDK_Mock_And_Testing.zh-CN.md +++ b/Documentation~/SDK_Mock_And_Testing.zh-CN.md @@ -2,8 +2,6 @@ English documentation: [SDK_Mock_And_Testing.md](SDK_Mock_And_Testing.md). -公开 DLL-only 包在 `Aisu.SIM1.Face.Runtime.dll` 中包含运行时 Mock 支持,但不包含 EditMode 测试源码。 - ## Editor Mock 无真实硬件进行 Editor 联调时,在 `FaceSdkSettings` 中启用: @@ -12,7 +10,14 @@ English documentation: [SDK_Mock_And_Testing.md](SDK_Mock_And_Testing.md). Use Mock In Editor = true ``` -启用后,SDK 在 Unity Editor 中使用内置 Mock 通信层,不会打开真实串口。 +启用后,SDK 在 Unity Editor 中使用 `MockFaceModuleTransport`,不会打开真实串口。 + +Mock 模式适用于: + +- UI 流程测试 +- 命令回调测试 +- 用户列表显示测试 +- 基础录入和验证流程测试 ## 真实硬件验证 @@ -20,9 +25,12 @@ Use Mock In Editor = true 1. 设置 `Use Mock In Editor = false`。 2. 配置 `Editor Port Name`、`Editor Baud Rate` 和 `Editor Read Buffer Size`。 -3. 在场景中创建 `FaceModuleManager`。 -4. 调用 `Open()`,然后等待 `WaitReadyAsync()` 或处理 `OnReady`。 +3. 打开包含一个 `FaceModuleManager` 的场景。 +4. 调用 `Open()`。 +5. 等待 `WaitReadyAsync()` 或处理 `OnReady`。 -## 自动化测试 +## 日志 -内部 EditMode 测试保留在私有开发 SDK 仓库中,不随 DLL-only 公开包发布。 +启用 `RawLogEnabled` 后,可以通过 `OnRawLog` 接收原始 TX/RX 日志。 + +启用 `DebugLogEnabled` 后,可以输出 SDK 层 Debug 日志。 diff --git a/Documentation~/SDK_QuickStart.md b/Documentation~/SDK_QuickStart.md index 48182c8..1425a39 100644 --- a/Documentation~/SDK_QuickStart.md +++ b/Documentation~/SDK_QuickStart.md @@ -2,23 +2,7 @@ 中文说明见 [SDK_QuickStart.zh-CN.md](SDK_QuickStart.zh-CN.md). -This public UPM package is distributed as compiled DLLs and does not include SDK source code, demo source code, test source code, or debug symbols. - -## 1. Install - -Add the package through Unity Package Manager: - -```text -https://git.aisu.xin/aisu-sdk/si-m1-face-package.git#v0.1.2 -``` - -Or add it to `Packages/manifest.json`: - -```json -"xin.aisu.si-m1.face": "https://git.aisu.xin/aisu-sdk/si-m1-face-package.git#v0.1.2" -``` - -## 2. Create Settings +## 1. Settings Open Unity menu: @@ -26,25 +10,26 @@ Open Unity menu: AISU/SI-M1 Face SDK/Settings ``` -The tool creates or loads this settings asset inside the importing Unity project: +The default settings asset path is: ```text -Assets/AISU/SI-M1 Face SDK/FaceSdkSettings.asset +Assets/Resources/AISU/SI-M1 Face SDK/FaceSdkSettings.asset ``` -Configure serial port, baud rate, mock mode, and logging options. +Configure: -## 3. Create Manager +- Transport mode +- Runtime serial port and baud rate +- Editor serial debug parameters +- Mock mode +- Auto verify options +- Debug and raw protocol logs -Open Unity menu: +## 2. Scene Manager -```text -AISU/SI-M1 Face SDK/Create Manager GameObject -``` +Add one `FaceModuleManager` to the scene and bind the settings asset. Keep only one manager in a scene to avoid duplicate serial connections and duplicated callbacks. -Keep one `FaceModuleManager` in the scene to avoid duplicate serial connections and duplicate event dispatch. - -## 4. Minimal Code +## 3. Minimal Code ```csharp using Aisu.SIM1.Face.Core; @@ -57,24 +42,71 @@ public sealed class FaceExample : MonoBehaviour private async void Start() { manager.Open(); - await manager.WaitReadyAsync(); + await manager.WaitReadyAsync(5000); + var status = await manager.Basic.GetStatusAsync(); var version = await manager.Basic.GetVersionAsync(); - Debug.Log("SI-M1 version: " + version); + Debug.Log("Status: " + status); + Debug.Log("Version: " + version); + } + + private void OnApplicationQuit() + { + manager?.Close(); } } ``` -## 5. Runtime Modes +## 4. Common Operations -| Scenario | Recommended Setting | -|---|---| -| Editor integration without hardware | `Use Mock In Editor = true` | -| Editor with real serial hardware | `Use Mock In Editor = false`, configure editor serial parameters | -| Windows Player | `Transport Mode = SerialPort` or `Auto`, configure runtime serial parameters | +Face verification: -## Notes +```csharp +var result = await manager.Verify.VerifyAsync(timeout: 10); +if (result.Success) +{ + Debug.Log("UserId: " + result.UserId); + Debug.Log("UserName: " + result.UserName); +} +``` -- Git URL packages may appear as `xin.aisu.si-m1.face@` in Unity's package cache. This is normal. -- This DLL-only release does not include importable demo samples. -- Demo source and EditMode test source remain in the private development SDK repository. +Face enrollment: + +```csharp +var enroll = await manager.Enrollment.EnrollSingleAsync( + admin: false, + userName: "Tester", + timeout: 20); +``` + +User list: + +```csharp +var ids = await manager.Users.GetAllUserIdsAsync(); +``` + +Auto verify: + +```csharp +manager.OnAutoVerifyResult += result => +{ + Debug.Log("AutoVerify: " + result.ResultCode); +}; + +var control = await manager.StartAutoVerifyAsync(timeout: 10); +if (!control.Success) +{ + Debug.LogError("AutoVerify start failed: " + control.ResultCode); +} + +await manager.StopFaceOperationAsync(); +``` + +## 5. Samples + +Sample scenes: + +```text +Packages/xin.aisu.si-m1.face/Samples/SI-M1 Face Demo/Scenes/FaceModuleDemo.unity +Packages/xin.aisu.si-m1.face/Samples/Face Detection Demo/Scenes/FaceDetectionDemo.unity +``` diff --git a/Documentation~/SDK_QuickStart.zh-CN.md b/Documentation~/SDK_QuickStart.zh-CN.md index ffc65e5..87a7be2 100644 --- a/Documentation~/SDK_QuickStart.zh-CN.md +++ b/Documentation~/SDK_QuickStart.zh-CN.md @@ -2,23 +2,7 @@ English documentation: [SDK_QuickStart.md](SDK_QuickStart.md). -公开 UPM 包以编译后的 DLL 形式发布,不包含 SDK 源码、Demo 源码、测试源码或调试符号。 - -## 1. 安装 - -通过 Unity Package Manager 添加 Git URL: - -```text -https://git.aisu.xin/aisu-sdk/si-m1-face-package.git#v0.1.2 -``` - -或写入 `Packages/manifest.json`: - -```json -"xin.aisu.si-m1.face": "https://git.aisu.xin/aisu-sdk/si-m1-face-package.git#v0.1.2" -``` - -## 2. 创建配置 +## 1. 配置 打开 Unity 菜单: @@ -26,25 +10,26 @@ https://git.aisu.xin/aisu-sdk/si-m1-face-package.git#v0.1.2 AISU/SI-M1 Face SDK/Settings ``` -工具会在导入该包的 Unity 项目中创建或加载配置资产: +默认配置资产路径: ```text -Assets/AISU/SI-M1 Face SDK/FaceSdkSettings.asset +Assets/Resources/AISU/SI-M1 Face SDK/FaceSdkSettings.asset ``` -配置串口号、波特率、Mock 模式和日志选项。 +常用配置: -## 3. 创建 Manager +- 通信模式 +- 运行时串口号和波特率 +- Editor 串口调试参数 +- Mock 模式 +- 自动验证选项 +- Debug 日志和原始协议日志 -打开 Unity 菜单: +## 2. 场景 Manager -```text -AISU/SI-M1 Face SDK/Create Manager GameObject -``` +在场景中添加一个 `FaceModuleManager` 并绑定配置资产。每个场景只保留一个 Manager,避免重复打开串口和重复派发回调。 -每个场景建议只保留一个 `FaceModuleManager`,避免重复打开串口和重复派发事件。 - -## 4. 最小代码 +## 3. 最小代码 ```csharp using Aisu.SIM1.Face.Core; @@ -57,24 +42,71 @@ public sealed class FaceExample : MonoBehaviour private async void Start() { manager.Open(); - await manager.WaitReadyAsync(); + await manager.WaitReadyAsync(5000); + var status = await manager.Basic.GetStatusAsync(); var version = await manager.Basic.GetVersionAsync(); - Debug.Log("SI-M1 version: " + version); + Debug.Log("Status: " + status); + Debug.Log("Version: " + version); + } + + private void OnApplicationQuit() + { + manager?.Close(); } } ``` -## 5. 运行模式 +## 4. 常用操作 -| 场景 | 推荐配置 | -|---|---| -| Editor 中无硬件联调 | `Use Mock In Editor = true` | -| Editor 中连接真实串口硬件 | `Use Mock In Editor = false`,并配置 Editor 串口参数 | -| Windows Player | `Transport Mode = SerialPort` 或 `Auto`,并配置运行时串口参数 | +人脸验证: -## 注意事项 +```csharp +var result = await manager.Verify.VerifyAsync(timeout: 10); +if (result.Success) +{ + Debug.Log("UserId: " + result.UserId); + Debug.Log("UserName: " + result.UserName); +} +``` -- Unity 对 Git URL 包可能显示为 `xin.aisu.si-m1.face@`,这是正常行为。 -- DLL-only 公开版本不包含可导入 Demo 示例。 -- Demo 源码和 EditMode 测试源码保留在私有开发 SDK 仓库中。 +人脸录入: + +```csharp +var enroll = await manager.Enrollment.EnrollSingleAsync( + admin: false, + userName: "Tester", + timeout: 20); +``` + +用户列表: + +```csharp +var ids = await manager.Users.GetAllUserIdsAsync(); +``` + +自动验证: + +```csharp +manager.OnAutoVerifyResult += result => +{ + Debug.Log("AutoVerify: " + result.ResultCode); +}; + +var control = await manager.StartAutoVerifyAsync(timeout: 10); +if (!control.Success) +{ + Debug.LogError("AutoVerify start failed: " + control.ResultCode); +} + +await manager.StopFaceOperationAsync(); +``` + +## 5. Samples + +示例场景: + +```text +Packages/xin.aisu.si-m1.face/Samples/SI-M1 Face Demo/Scenes/FaceModuleDemo.unity +Packages/xin.aisu.si-m1.face/Samples/Face Detection Demo/Scenes/FaceDetectionDemo.unity +``` diff --git a/Editor/Aisu.SIM1.Face.Editor.dll b/Editor/Aisu.SIM1.Face.Editor.dll index 358855805f811177bab8d50d5a3e2a4089ea28b4..94562457ce29d602e9f51f6e6238fb9e9eb64ce3 100644 GIT binary patch delta 7369 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 K{ZR}~GXEEwUQZMN literal 19456 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 in `Library/PackageCache`. This is expected for Git URL packages; the package version remains defined by `package.json`. +| Settings Asset | `Assets/Resources/AISU/SI-M1 Face SDK/FaceSdkSettings.asset` | ## Quick Start -1. Open `AISU/SI-M1 Face SDK/Settings` and create or load `FaceSdkSettings`. -2. Set serial port, baud rate, mock mode, and logging options. -3. Open `AISU/SI-M1 Face SDK/Create Manager GameObject` to create a `FaceModuleManager` in the current scene. -4. Reference the manager from your own scripts and call the SDK services. +1. Open `AISU/SI-M1 Face SDK/Settings`. +2. Configure serial port, baud rate, mock mode, auto verify, and logging options. +3. Add one `FaceModuleManager` to the scene and bind the settings asset. +4. Call SDK services through `FaceModuleManager`. ```csharp using Aisu.SIM1.Face.Core; @@ -55,9 +38,25 @@ public sealed class FaceExample : MonoBehaviour var version = await manager.Basic.GetVersionAsync(); Debug.Log("SI-M1 version: " + version); } + + private void OnApplicationQuit() + { + manager?.Close(); + } } ``` +## Samples + +Sample scenes are under: + +```text +Packages/xin.aisu.si-m1.face/Samples/SI-M1 Face Demo/Scenes/FaceModuleDemo.unity +Packages/xin.aisu.si-m1.face/Samples/Face Detection Demo/Scenes/FaceDetectionDemo.unity +``` + +Use `SI-M1 Face Demo` for full SDK command testing. Use `Face Detection Demo` for a compact camera, serial, enrollment, verification, and user-list workflow. + ## Documentation | English | Chinese | @@ -65,14 +64,11 @@ public sealed class FaceExample : MonoBehaviour | [Quick Start](Documentation~/SDK_QuickStart.md) | [快速开始](Documentation~/SDK_QuickStart.zh-CN.md) | | [Configuration](Documentation~/SDK_Configuration.md) | [配置说明](Documentation~/SDK_Configuration.zh-CN.md) | | [API Reference](Documentation~/SDK_API_Reference.md) | [API 参考](Documentation~/SDK_API_Reference.zh-CN.md) | -| [License Request](Documentation~/SDK_License_Request.md) | [授权申请](Documentation~/SDK_License_Request.zh-CN.md) | | [Mock and Testing](Documentation~/SDK_Mock_And_Testing.md) | [Mock 与测试](Documentation~/SDK_Mock_And_Testing.zh-CN.md) | -| [Demo UI Notice](Documentation~/README_UI.md) | [Demo UI 说明](Documentation~/README_UI.zh-CN.md) | +| [Demo UI](Documentation~/README_UI.md) | [Demo UI](Documentation~/README_UI.zh-CN.md) | -## Public Package Scope +## Runtime Notes -- SDK source files are not included. -- `.pdb` debug symbols are not included. -- Demo and test source files are not included. -- Importable `Samples~` are not included in this DLL-only release. -- Sample source and internal validation tests are maintained in the private development SDK repository. +- Keep one `FaceModuleManager` in each scene. +- Use `Close()` or `CloseAsync()` when leaving a scene or quitting the app. +- When auto verify is enabled, use `StopFaceOperationAsync()` before enrollment, user management, QR scan, image capture, or other exclusive operations. diff --git a/README.zh-CN.md b/README.zh-CN.md index 6638e76..d8434fb 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -1,6 +1,6 @@ # AISU SI-M1 Face SDK -`xin.aisu.si-m1.face` 是面向 AISU SI-M1 人脸识别模组的 Unity UPM 包。公开发布包以编译后的 DLL 形式提供,不包含 SDK 源码、Demo 源码、测试源码或调试符号。 +`xin.aisu.si-m1.face` 是面向 AISU SI-M1 人脸识别模组的 Unity SDK,提供串口通信、协议封包/拆包、模组生命周期管理、人脸验证、人脸录入、用户管理、图片抓拍、二维码、UVC 参数、Mock 通信和示例场景。 English documentation: [README.md](README.md). @@ -10,34 +10,17 @@ English documentation: [README.md](README.md). |---|---| | Package Name | `xin.aisu.si-m1.face` | | Display Name | `AISU SI-M1 Face SDK` | -| Version | `0.1.5` | | Runtime Assembly | `Aisu.SIM1.Face.Runtime.dll` | | Editor Assembly | `Aisu.SIM1.Face.Editor.dll` | | Unity Version | `2021.3` 或更高 | -| 用户项目配置资产 | 导入项目中的 `Assets/AISU/SI-M1 Face SDK/FaceSdkSettings.asset` | - -## 安装 - -在 Unity Package Manager 中使用以下 Git URL 导入: - -```text -https://git.aisu.xin/aisu-sdk/si-m1-face-package.git#v0.1.5 -``` - -或写入 `Packages/manifest.json`: - -```json -"xin.aisu.si-m1.face": "https://git.aisu.xin/aisu-sdk/si-m1-face-package.git#v0.1.5" -``` - -Unity 对 Git URL 包可能会在 `Library/PackageCache` 中显示为 `xin.aisu.si-m1.face@`。这是 Git 包的正常行为;包版本仍由 `package.json` 中的 `version` 字段定义。 +| 配置资产路径 | `Assets/Resources/AISU/SI-M1 Face SDK/FaceSdkSettings.asset` | ## 快速开始 -1. 打开 `AISU/SI-M1 Face SDK/Settings`,创建或加载 `FaceSdkSettings`。 -2. 配置串口号、波特率、Mock 模式和日志选项。 -3. 打开 `AISU/SI-M1 Face SDK/Create Manager GameObject`,在当前场景中创建 `FaceModuleManager`。 -4. 在业务脚本中引用该 Manager 并调用 SDK 服务。 +1. 打开 `AISU/SI-M1 Face SDK/Settings`。 +2. 配置串口号、波特率、Mock 模式、自动验证和日志选项。 +3. 在场景中保留一个 `FaceModuleManager`,并绑定配置资产。 +4. 通过 `FaceModuleManager` 调用 SDK 服务。 ```csharp using Aisu.SIM1.Face.Core; @@ -55,9 +38,25 @@ public sealed class FaceExample : MonoBehaviour var version = await manager.Basic.GetVersionAsync(); Debug.Log("SI-M1 version: " + version); } + + private void OnApplicationQuit() + { + manager?.Close(); + } } ``` +## Samples + +示例场景路径: + +```text +Packages/xin.aisu.si-m1.face/Samples/SI-M1 Face Demo/Scenes/FaceModuleDemo.unity +Packages/xin.aisu.si-m1.face/Samples/Face Detection Demo/Scenes/FaceDetectionDemo.unity +``` + +`SI-M1 Face Demo` 用于完整 SDK 命令测试。`Face Detection Demo` 用于摄像头、串口、录入、识别和用户列表的最小流程测试。 + ## 文档 | English | 中文 | @@ -65,14 +64,11 @@ public sealed class FaceExample : MonoBehaviour | [Quick Start](Documentation~/SDK_QuickStart.md) | [快速开始](Documentation~/SDK_QuickStart.zh-CN.md) | | [Configuration](Documentation~/SDK_Configuration.md) | [配置说明](Documentation~/SDK_Configuration.zh-CN.md) | | [API Reference](Documentation~/SDK_API_Reference.md) | [API 参考](Documentation~/SDK_API_Reference.zh-CN.md) | -| [License Request](Documentation~/SDK_License_Request.md) | [授权申请](Documentation~/SDK_License_Request.zh-CN.md) | | [Mock and Testing](Documentation~/SDK_Mock_And_Testing.md) | [Mock 与测试](Documentation~/SDK_Mock_And_Testing.zh-CN.md) | -| [Demo UI Notice](Documentation~/README_UI.md) | [Demo UI 说明](Documentation~/README_UI.zh-CN.md) | +| [Demo UI](Documentation~/README_UI.md) | [Demo UI](Documentation~/README_UI.zh-CN.md) | -## 公开包范围 +## 运行注意 -- 不包含 SDK 源码。 -- 不包含 `.pdb` 调试符号。 -- 不包含 Demo 和测试源码。 -- DLL-only 公开版本不包含可导入的 `Samples~`。 -- 示例源码和内部验证测试保留在私有开发 SDK 仓库中。 +- 每个场景只保留一个 `FaceModuleManager`。 +- 离开场景或退出应用时调用 `Close()` 或 `CloseAsync()`。 +- 开启自动验证后,录入、用户管理、二维码、抓拍等独占操作前调用 `StopFaceOperationAsync()`。 diff --git a/Resources/AISU/SI-M1 Face SDK/FaceSdkSettings.asset b/Resources/AISU/SI-M1 Face SDK/FaceSdkSettings.asset index 96e153c..b5b5702 100644 --- a/Resources/AISU/SI-M1 Face SDK/FaceSdkSettings.asset +++ b/Resources/AISU/SI-M1 Face SDK/FaceSdkSettings.asset @@ -24,6 +24,7 @@ MonoBehaviour: m_mockResponseDelayFrames: 1 m_autoVerifyOnOpen: 0 m_autoVerifyTimeout: 10 + m_autoVerifyResultIntervalMs: 1000 m_stopAutoVerifyBeforeExclusiveCommand: 1 m_exclusiveCommandPolicy: 1 m_debugLogEnabled: 1 diff --git a/Runtime/Aisu.SIM1.Face.Runtime.dll b/Runtime/Aisu.SIM1.Face.Runtime.dll index e2be0d48a712b67cacea1e84fd32770bcf22103c..f0d7231cd5991e5eb3bc0af79941cfced78f189e 100644 GIT binary patch literal 118784 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
  • f2{?>xuD- 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 public void DisconnectModule() { - m_manager?.Close(); - LogInfo("模组连接已关闭"); - RefreshStatus(); + RunAsync(async () => + { + if (m_manager != null) + { + await m_manager.CloseAsync(); + } + + LogInfo("模组连接已关闭"); + RefreshStatus(); + }); } /// @@ -426,7 +433,7 @@ namespace Aisu.SIM1.Face.Samples.FaceDetectionDemo { try { - await m_manager.Basic.FaceResetAsync(); + await m_manager.StopFaceOperationAsync(); LogInfo(operationName + " 前已取消残留人脸流程"); } catch (Exception ex) diff --git a/Samples~/Face Detection Demo/Scripts/FaceDetectionDemoController.cs.meta b/Samples/Face Detection Demo/Scripts/FaceDetectionDemoController.cs.meta similarity index 100% rename from Samples~/Face Detection Demo/Scripts/FaceDetectionDemoController.cs.meta rename to Samples/Face Detection Demo/Scripts/FaceDetectionDemoController.cs.meta diff --git a/Samples~/Face Detection Demo/Scripts/FaceDetectionDemoLogger.cs b/Samples/Face Detection Demo/Scripts/FaceDetectionDemoLogger.cs similarity index 100% rename from Samples~/Face Detection Demo/Scripts/FaceDetectionDemoLogger.cs rename to Samples/Face Detection Demo/Scripts/FaceDetectionDemoLogger.cs diff --git a/Samples~/Face Detection Demo/Scripts/FaceDetectionDemoLogger.cs.meta b/Samples/Face Detection Demo/Scripts/FaceDetectionDemoLogger.cs.meta similarity index 100% rename from Samples~/Face Detection Demo/Scripts/FaceDetectionDemoLogger.cs.meta rename to Samples/Face Detection Demo/Scripts/FaceDetectionDemoLogger.cs.meta diff --git a/Samples~/Face Detection Demo/Scripts/FaceDetectionDemoUserList.cs b/Samples/Face Detection Demo/Scripts/FaceDetectionDemoUserList.cs similarity index 100% rename from Samples~/Face Detection Demo/Scripts/FaceDetectionDemoUserList.cs rename to Samples/Face Detection Demo/Scripts/FaceDetectionDemoUserList.cs diff --git a/Samples~/Face Detection Demo/Scripts/FaceDetectionDemoUserList.cs.meta b/Samples/Face Detection Demo/Scripts/FaceDetectionDemoUserList.cs.meta similarity index 100% rename from Samples~/Face Detection Demo/Scripts/FaceDetectionDemoUserList.cs.meta rename to Samples/Face Detection Demo/Scripts/FaceDetectionDemoUserList.cs.meta diff --git a/Samples~/SI-M1 Face Demo.meta b/Samples/SI-M1 Face Demo.meta similarity index 100% rename from Samples~/SI-M1 Face Demo.meta rename to Samples/SI-M1 Face Demo.meta diff --git a/Samples~/SI-M1 Face Demo/Aisu.SIM1.Face.Samples.asmdef b/Samples/SI-M1 Face Demo/Aisu.SIM1.Face.Samples.asmdef similarity index 100% rename from Samples~/SI-M1 Face Demo/Aisu.SIM1.Face.Samples.asmdef rename to Samples/SI-M1 Face Demo/Aisu.SIM1.Face.Samples.asmdef diff --git a/Samples~/SI-M1 Face Demo/Aisu.SIM1.Face.Samples.asmdef.meta b/Samples/SI-M1 Face Demo/Aisu.SIM1.Face.Samples.asmdef.meta similarity index 100% rename from Samples~/SI-M1 Face Demo/Aisu.SIM1.Face.Samples.asmdef.meta rename to Samples/SI-M1 Face Demo/Aisu.SIM1.Face.Samples.asmdef.meta diff --git a/Samples~/SI-M1 Face Demo/Scenes.meta b/Samples/SI-M1 Face Demo/Scenes.meta similarity index 100% rename from Samples~/SI-M1 Face Demo/Scenes.meta rename to Samples/SI-M1 Face Demo/Scenes.meta diff --git a/Samples~/SI-M1 Face Demo/Scenes/FaceModuleDemo.unity b/Samples/SI-M1 Face Demo/Scenes/FaceModuleDemo.unity similarity index 100% rename from Samples~/SI-M1 Face Demo/Scenes/FaceModuleDemo.unity rename to Samples/SI-M1 Face Demo/Scenes/FaceModuleDemo.unity diff --git a/Samples~/SI-M1 Face Demo/Scenes/FaceModuleDemo.unity.meta b/Samples/SI-M1 Face Demo/Scenes/FaceModuleDemo.unity.meta similarity index 100% rename from Samples~/SI-M1 Face Demo/Scenes/FaceModuleDemo.unity.meta rename to Samples/SI-M1 Face Demo/Scenes/FaceModuleDemo.unity.meta diff --git a/Samples~/SI-M1 Face Demo/Scripts.meta b/Samples/SI-M1 Face Demo/Scripts.meta similarity index 100% rename from Samples~/SI-M1 Face Demo/Scripts.meta rename to Samples/SI-M1 Face Demo/Scripts.meta diff --git a/Samples~/SI-M1 Face Demo/Scripts/Core.meta b/Samples/SI-M1 Face Demo/Scripts/Core.meta similarity index 100% rename from Samples~/SI-M1 Face Demo/Scripts/Core.meta rename to Samples/SI-M1 Face Demo/Scripts/Core.meta diff --git a/Samples~/SI-M1 Face Demo/Scripts/Core/FaceModuleKeyboardTester.cs b/Samples/SI-M1 Face Demo/Scripts/Core/FaceModuleKeyboardTester.cs similarity index 99% rename from Samples~/SI-M1 Face Demo/Scripts/Core/FaceModuleKeyboardTester.cs rename to Samples/SI-M1 Face Demo/Scripts/Core/FaceModuleKeyboardTester.cs index 687c932..195a9f1 100644 --- a/Samples~/SI-M1 Face Demo/Scripts/Core/FaceModuleKeyboardTester.cs +++ b/Samples/SI-M1 Face Demo/Scripts/Core/FaceModuleKeyboardTester.cs @@ -303,10 +303,14 @@ namespace Aisu.SIM1.Face.Core /// /// 关闭串口。 /// - public void CloseSerial() + public async void CloseSerial() { - Manager.Close(); - Log("串口已关闭。"); + try + { + await Manager.CloseAsync(); + Log("串口已关闭。"); + } + catch (Exception ex) { LogError("关闭串口失败:" + ex.Message); } } /// @@ -379,7 +383,7 @@ namespace Aisu.SIM1.Face.Core /// public async void ResetModule() { - try { await Manager.Basic.ResetAsync(); Log("RESET 成功。"); } + try { await Manager.StopFaceOperationAsync(); Log("已停止当前人脸流程。"); } catch (Exception ex) { LogError("RESET 失败:" + ex.Message); } } diff --git a/Samples~/SI-M1 Face Demo/Scripts/Core/FaceModuleKeyboardTester.cs.meta b/Samples/SI-M1 Face Demo/Scripts/Core/FaceModuleKeyboardTester.cs.meta similarity index 100% rename from Samples~/SI-M1 Face Demo/Scripts/Core/FaceModuleKeyboardTester.cs.meta rename to Samples/SI-M1 Face Demo/Scripts/Core/FaceModuleKeyboardTester.cs.meta diff --git a/Samples~/SI-M1 Face Demo/UI.meta b/Samples/SI-M1 Face Demo/UI.meta similarity index 100% rename from Samples~/SI-M1 Face Demo/UI.meta rename to Samples/SI-M1 Face Demo/UI.meta diff --git a/Samples~/SI-M1 Face Demo/UI/Common.meta b/Samples/SI-M1 Face Demo/UI/Common.meta similarity index 100% rename from Samples~/SI-M1 Face Demo/UI/Common.meta rename to Samples/SI-M1 Face Demo/UI/Common.meta diff --git a/Samples~/SI-M1 Face Demo/UI/Common/FaceModuleDemoBootstrap.cs b/Samples/SI-M1 Face Demo/UI/Common/FaceModuleDemoBootstrap.cs similarity index 100% rename from Samples~/SI-M1 Face Demo/UI/Common/FaceModuleDemoBootstrap.cs rename to Samples/SI-M1 Face Demo/UI/Common/FaceModuleDemoBootstrap.cs diff --git a/Samples~/SI-M1 Face Demo/UI/Common/FaceModuleDemoBootstrap.cs.meta b/Samples/SI-M1 Face Demo/UI/Common/FaceModuleDemoBootstrap.cs.meta similarity index 100% rename from Samples~/SI-M1 Face Demo/UI/Common/FaceModuleDemoBootstrap.cs.meta rename to Samples/SI-M1 Face Demo/UI/Common/FaceModuleDemoBootstrap.cs.meta diff --git a/Samples~/SI-M1 Face Demo/UI/Common/FaceModuleUiCommon.cs b/Samples/SI-M1 Face Demo/UI/Common/FaceModuleUiCommon.cs similarity index 100% rename from Samples~/SI-M1 Face Demo/UI/Common/FaceModuleUiCommon.cs rename to Samples/SI-M1 Face Demo/UI/Common/FaceModuleUiCommon.cs diff --git a/Samples~/SI-M1 Face Demo/UI/Common/FaceModuleUiCommon.cs.meta b/Samples/SI-M1 Face Demo/UI/Common/FaceModuleUiCommon.cs.meta similarity index 100% rename from Samples~/SI-M1 Face Demo/UI/Common/FaceModuleUiCommon.cs.meta rename to Samples/SI-M1 Face Demo/UI/Common/FaceModuleUiCommon.cs.meta diff --git a/Samples~/SI-M1 Face Demo/UI/Pages.meta b/Samples/SI-M1 Face Demo/UI/Pages.meta similarity index 100% rename from Samples~/SI-M1 Face Demo/UI/Pages.meta rename to Samples/SI-M1 Face Demo/UI/Pages.meta diff --git a/Samples~/SI-M1 Face Demo/UI/Pages/FaceModuleAdvancedPages.cs b/Samples/SI-M1 Face Demo/UI/Pages/FaceModuleAdvancedPages.cs similarity index 100% rename from Samples~/SI-M1 Face Demo/UI/Pages/FaceModuleAdvancedPages.cs rename to Samples/SI-M1 Face Demo/UI/Pages/FaceModuleAdvancedPages.cs diff --git a/Samples~/SI-M1 Face Demo/UI/Pages/FaceModuleAdvancedPages.cs.meta b/Samples/SI-M1 Face Demo/UI/Pages/FaceModuleAdvancedPages.cs.meta similarity index 100% rename from Samples~/SI-M1 Face Demo/UI/Pages/FaceModuleAdvancedPages.cs.meta rename to Samples/SI-M1 Face Demo/UI/Pages/FaceModuleAdvancedPages.cs.meta diff --git a/Samples~/SI-M1 Face Demo/UI/Pages/FaceModulePages.cs b/Samples/SI-M1 Face Demo/UI/Pages/FaceModulePages.cs similarity index 98% rename from Samples~/SI-M1 Face Demo/UI/Pages/FaceModulePages.cs rename to Samples/SI-M1 Face Demo/UI/Pages/FaceModulePages.cs index a5b8763..70f89a5 100644 --- a/Samples~/SI-M1 Face Demo/UI/Pages/FaceModulePages.cs +++ b/Samples/SI-M1 Face Demo/UI/Pages/FaceModulePages.cs @@ -118,9 +118,12 @@ namespace Aisu.SIM1.Face.UI.Pages /// public void CloseConnection() { - m_manager.Close(); - RefreshState(); - SetResult("连接已关闭"); + RunAsync(async () => + { + await m_manager.CloseAsync(); + RefreshState(); + SetResult("连接已关闭"); + }); } /// 等待 READY NOTE。 @@ -439,14 +442,7 @@ namespace Aisu.SIM1.Face.UI.Pages RunAsync(async () => { if (!RequireConnected()) return; - if (m_manager.IsAutoVerifyEnabled) - { - await m_manager.StopAutoVerifyAsync(); - SetResult("自动验证已关闭"); - return; - } - - await m_manager.Basic.ResetAsync(); + await m_manager.StopFaceOperationAsync(); SetResult("已停止验证"); }); } @@ -844,14 +840,7 @@ namespace Aisu.SIM1.Face.UI.Pages RunAsync(async () => { if (!RequireConnected()) return; - if (m_manager.IsAutoVerifyEnabled) - { - await m_manager.StopAutoVerifyAsync(); - SetResult("自动探测已停止"); - return; - } - - await m_manager.Basic.ResetAsync(); + await m_manager.StopFaceOperationAsync(); SetResult("已停止"); }); } diff --git a/Samples~/SI-M1 Face Demo/UI/Pages/FaceModulePages.cs.meta b/Samples/SI-M1 Face Demo/UI/Pages/FaceModulePages.cs.meta similarity index 100% rename from Samples~/SI-M1 Face Demo/UI/Pages/FaceModulePages.cs.meta rename to Samples/SI-M1 Face Demo/UI/Pages/FaceModulePages.cs.meta diff --git a/Samples~/SI-M1 Face Demo/UI/ViewModels.meta b/Samples/SI-M1 Face Demo/UI/ViewModels.meta similarity index 100% rename from Samples~/SI-M1 Face Demo/UI/ViewModels.meta rename to Samples/SI-M1 Face Demo/UI/ViewModels.meta diff --git a/Samples~/SI-M1 Face Demo/UI/ViewModels/FaceModuleViewModels.cs b/Samples/SI-M1 Face Demo/UI/ViewModels/FaceModuleViewModels.cs similarity index 100% rename from Samples~/SI-M1 Face Demo/UI/ViewModels/FaceModuleViewModels.cs rename to Samples/SI-M1 Face Demo/UI/ViewModels/FaceModuleViewModels.cs diff --git a/Samples~/SI-M1 Face Demo/UI/ViewModels/FaceModuleViewModels.cs.meta b/Samples/SI-M1 Face Demo/UI/ViewModels/FaceModuleViewModels.cs.meta similarity index 100% rename from Samples~/SI-M1 Face Demo/UI/ViewModels/FaceModuleViewModels.cs.meta rename to Samples/SI-M1 Face Demo/UI/ViewModels/FaceModuleViewModels.cs.meta diff --git a/Samples~/SI-M1 Face Demo/Editor.meta b/Samples~/SI-M1 Face Demo/Editor.meta deleted file mode 100644 index c093473..0000000 --- a/Samples~/SI-M1 Face Demo/Editor.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 4ac476647a08a364289fa596d310bf3a -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Samples~/SI-M1 Face Demo/Editor/Aisu.SIM1.Face.Samples.Editor.asmdef b/Samples~/SI-M1 Face Demo/Editor/Aisu.SIM1.Face.Samples.Editor.asmdef deleted file mode 100644 index f0766bd..0000000 --- a/Samples~/SI-M1 Face Demo/Editor/Aisu.SIM1.Face.Samples.Editor.asmdef +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "Aisu.SIM1.Face.Samples.Editor", - "rootNamespace": "Aisu.SIM1.Face.Editor", - "references": [ - "Aisu.SIM1.Face.Runtime", - "Aisu.SIM1.Face.Samples" - ], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [], - "versionDefines": [], - "noEngineReferences": false -} diff --git a/Samples~/SI-M1 Face Demo/Editor/Aisu.SIM1.Face.Samples.Editor.asmdef.meta b/Samples~/SI-M1 Face Demo/Editor/Aisu.SIM1.Face.Samples.Editor.asmdef.meta deleted file mode 100644 index 2f6f188..0000000 --- a/Samples~/SI-M1 Face Demo/Editor/Aisu.SIM1.Face.Samples.Editor.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 73502db286784cc3ac4a9e71f06f1002 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Samples~/SI-M1 Face Demo/Editor/FaceModuleDemoSceneGenerator.cs b/Samples~/SI-M1 Face Demo/Editor/FaceModuleDemoSceneGenerator.cs deleted file mode 100644 index f3d967e..0000000 --- a/Samples~/SI-M1 Face Demo/Editor/FaceModuleDemoSceneGenerator.cs +++ /dev/null @@ -1,39 +0,0 @@ -#if UNITY_EDITOR -using System.IO; -using Aisu.SIM1.Face.Core; -using Aisu.SIM1.Face.UI.Common; -using UnityEditor; -using UnityEditor.SceneManagement; -using UnityEngine; - -namespace Aisu.SIM1.Face.Editor -{ - /// - /// 生成 SI-M1 全功能 Demo 场景。 - /// - public static class FaceModuleDemoSceneGenerator - { - private const string ScenePath = "Assets/SI-M1 Face Demo/Scenes/FaceModuleDemo.unity"; // Demo 场景保存路径。 - - /// - /// 创建并保存 Demo 场景。 - /// - [MenuItem("AISU/SI-M1 Face SDK/Regenerate Imported Demo Scene")] - public static void Generate() - { - Directory.CreateDirectory(Path.GetDirectoryName(ScenePath)); - var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single); - var managerGo = new GameObject("FaceModuleManager"); - managerGo.AddComponent(); - - var bootstrapGo = new GameObject("FaceModuleDemoBootstrap"); - bootstrapGo.AddComponent(); - - EditorSceneManager.SaveScene(scene, ScenePath); - AssetDatabase.Refresh(); - Selection.activeObject = bootstrapGo; - Debug.Log("FaceModule demo scene generated: " + ScenePath); - } - } -} -#endif diff --git a/Samples~/SI-M1 Face Demo/Editor/FaceModuleDemoSceneGenerator.cs.meta b/Samples~/SI-M1 Face Demo/Editor/FaceModuleDemoSceneGenerator.cs.meta deleted file mode 100644 index 2d70ed3..0000000 --- a/Samples~/SI-M1 Face Demo/Editor/FaceModuleDemoSceneGenerator.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 230f42ee40b783c4784659a677f2fc59 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/package.json b/package.json index db315a9..287c7c7 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "AISU SI-M1 Face SDK", "version": "0.1.6", "unity": "2021.3", - "description": "Unity UPM package for the AISU SI-M1 face recognition module protocol, transport, command services, lifecycle manager, tests, and demo sample.", + "description": "Unity UPM package for the AISU SI-M1 face recognition module protocol, transport, command services, lifecycle manager, and demo samples.", "author": { "name": "AISU" }, @@ -19,12 +19,12 @@ { "displayName": "SI-M1 Face Demo", "description": "Full demo scene and UI for connecting, registering, recognizing, querying, deleting, and releasing the SI-M1 face module.", - "path": "Samples~/SI-M1 Face Demo" + "path": "Samples/SI-M1 Face Demo" }, { "displayName": "Face Detection Demo", "description": "Minimal camera preview, serial connection, enrollment, recognition, and user data test scene.", - "path": "Samples~/Face Detection Demo" + "path": "Samples/Face Detection Demo" } ] }