# RelayController 继电器控制类实现说明 ## 概述 根据 `RelayUtils` 重写了一个更完善的继电器控制类 `RelayController`,位于 `device` 目录下,提供了您要求的三个核心功能。 ## 实现的功能 ### 1. 开启继电器 ```java // 开启继电器(默认设备) boolean success = RelayController.getInstance().openRelay(); // 开启继电器(指定设备类型) boolean success = RelayController.getInstance().openRelay(RelayController.PAD_TYPE_TWO); ``` ### 2. 关闭继电器 ```java // 关闭继电器(默认设备) boolean success = RelayController.getInstance().closeRelay(); // 关闭继电器(指定设备类型) boolean success = RelayController.getInstance().closeRelay(RelayController.PAD_TYPE_TWO); ``` ### 3. 开启继电器3秒后自动关闭 ```java // 开启继电器3秒后自动关闭(默认设备) boolean success = RelayController.getInstance().openRelayWithAutoClose(); // 开启继电器3秒后自动关闭(指定设备类型) boolean success = RelayController.getInstance().openRelayWithAutoClose(RelayController.PAD_TYPE_TWO); // 自定义延时时间(扩展功能) boolean success = RelayController.getInstance().openRelayWithAutoClose(RelayController.PAD_TYPE_DEFAULT, 5000); // 5秒后关闭 ``` ## 核心特性 ### 1. 单例模式设计 - 使用双重检查锁定确保线程安全 - 全局唯一实例,避免资源冲突 ### 2. 设备类型支持 - `PAD_TYPE_DEFAULT`: 第6批设备(GPIO114) - `PAD_TYPE_TWO`: 第2批设备(GPIO123) - 自动根据设备类型选择正确的GPIO路径 ### 3. 错误处理机制 - 写入失败时自动尝试设置GPIO方向 - 完整的异常捕获和日志记录 - 资源自动清理和关闭 ### 4. 延时自动关闭 - 使用 `Handler` 实现精确的延时控制 - 支持自定义延时时间 - 异步执行,不阻塞主线程 ### 5. 状态读取功能 ```java // 读取继电器当前状态 Boolean status = RelayController.getInstance().getRelayStatus(); if (status != null) { String statusText = status ? "开启" : "关闭"; Log.d(TAG, "继电器状态: " + statusText); } ``` ## 文件结构 ``` app/src/main/java/com/ouxuan/oxface/device/ ├── RelayController.java // 核心继电器控制类 └── RelayControllerUsageExample.java // 使用示例和集成指导 ``` ## 技术实现细节 ### GPIO路径配置 ```java // 第6批设备(默认) private static final String PWM_FLASH_OUT = "/sys/class/gpio/gpio114/direction"; private static final String PWM_FLASH = "/sys/class/gpio/gpio114/value"; // 第2批设备 private static final String PWM_FLASH_OUT_2 = "/sys/class/gpio/gpio123/direction"; private static final String PWM_FLASH_2 = "/sys/class/gpio/gpio123/value"; ``` ### GPIO操作命令 ```java private static final byte[] OPEN_RELAY = {'1'}; // 开启继电器 private static final byte[] CLOSE_RELAY = {'0'}; // 关闭继电器 private static final byte[] GPIO_OUT = {'o', 'u', 't'}; // 输出模式 private static final byte[] GPIO_IN = {'i', 'n'}; // 输入模式 ``` ### 自动关闭实现 ```java // 使用Handler实现延时关闭 handler.postDelayed(new Runnable() { @Override public void run() { closeRelay(padType); } }, 3000); // 3秒延时 ``` ## 使用示例 ### 在人脸识别成功后开门 ```java public class OXFaceOnlineActivity extends BaseActivity { private RelayController relayController; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 初始化继电器控制器 relayController = RelayController.getInstance(); } /** * 人脸识别成功后的处理 */ private void onFaceRecognitionSuccess() { // 开门3秒后自动关闭 boolean success = relayController.openRelayWithAutoClose(); if (success) { showToast("门已开启,请通过"); } else { showToast("开门失败,请重试"); } } @Override protected void onDestroy() { super.onDestroy(); // 清理资源 if (relayController != null) { relayController.release(); } } } ``` ### 手动控制示例 ```java // 手动开门 RelayController.getInstance().openRelay(); // 手动关门 RelayController.getInstance().closeRelay(); // 检查门锁状态 Boolean status = RelayController.getInstance().getRelayStatus(); ``` ## 相比原版RelayUtils的改进 ### 1. 架构改进 - **单例模式**: 避免多实例冲突 - **面向对象**: 更好的封装和复用 - **异步处理**: 使用Handler实现非阻塞延时 ### 2. 功能增强 - **状态读取**: 可以查询继电器当前状态 - **自定义延时**: 支持任意时长的自动关闭 - **设备类型枚举**: 更清晰的设备类型管理 ### 3. 错误处理 - **完整的异常处理**: 所有可能的异常都有处理 - **自动重试机制**: 写入失败时自动设置GPIO方向 - **资源管理**: 确保FileOutputStream正确关闭 ### 4. 日志系统 - **统一日志管理**: 使用LogManager统一记录 - **详细的操作日志**: 便于调试和问题排查 - **状态跟踪**: 记录每个操作的结果 ## 集成建议 1. **在人脸识别成功回调中使用**: ```java relayController.openRelayWithAutoClose(); ``` 2. **在门禁控制逻辑中集成**: ```java // 配合UDP门禁控制使用 if (isUDPInitialized && udpExample != null) { udpExample.handleFaceRecognitionSuccess(true); } // 同时控制本地继电器 relayController.openRelayWithAutoClose(); ``` 3. **在调试界面中添加手动控制**: ```java // 调试用的手动开门按钮 btnManualOpen.setOnClickListener(v -> relayController.openRelay()); btnManualClose.setOnClickListener(v -> relayController.closeRelay()); ``` ## 总结 新的 `RelayController` 类提供了您要求的三个核心功能: 1. ✅ **开启继电器**: `openRelay()` 方法 2. ✅ **关闭继电器**: `closeRelay()` 方法 3. ✅ **开启继电器3秒后自动关闭**: `openRelayWithAutoClose()` 方法 同时还提供了更多实用功能:状态读取、自定义延时、设备类型支持、完整的错误处理等。这个实现更加健壮、易用,适合在人脸识别门禁系统中使用。