oxFaceAndroid
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

6.2 KiB

RelayController 继电器控制类实现说明

概述

根据 RelayUtils 重写了一个更完善的继电器控制类 RelayController,位于 device 目录下,提供了您要求的三个核心功能。

实现的功能

1. 开启继电器

// 开启继电器(默认设备)
boolean success = RelayController.getInstance().openRelay();

// 开启继电器(指定设备类型)
boolean success = RelayController.getInstance().openRelay(RelayController.PAD_TYPE_TWO);

2. 关闭继电器

// 关闭继电器(默认设备)
boolean success = RelayController.getInstance().closeRelay();

// 关闭继电器(指定设备类型)
boolean success = RelayController.getInstance().closeRelay(RelayController.PAD_TYPE_TWO);

3. 开启继电器3秒后自动关闭

// 开启继电器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. 状态读取功能

// 读取继电器当前状态
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路径配置

// 第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操作命令

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'};  // 输入模式

自动关闭实现

// 使用Handler实现延时关闭
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        closeRelay(padType);
    }
}, 3000); // 3秒延时

使用示例

在人脸识别成功后开门

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();
        }
    }
}

手动控制示例

// 手动开门
RelayController.getInstance().openRelay();

// 手动关门
RelayController.getInstance().closeRelay();

// 检查门锁状态
Boolean status = RelayController.getInstance().getRelayStatus();

相比原版RelayUtils的改进

1. 架构改进

  • 单例模式: 避免多实例冲突
  • 面向对象: 更好的封装和复用
  • 异步处理: 使用Handler实现非阻塞延时

2. 功能增强

  • 状态读取: 可以查询继电器当前状态
  • 自定义延时: 支持任意时长的自动关闭
  • 设备类型枚举: 更清晰的设备类型管理

3. 错误处理

  • 完整的异常处理: 所有可能的异常都有处理
  • 自动重试机制: 写入失败时自动设置GPIO方向
  • 资源管理: 确保FileOutputStream正确关闭

4. 日志系统

  • 统一日志管理: 使用LogManager统一记录
  • 详细的操作日志: 便于调试和问题排查
  • 状态跟踪: 记录每个操作的结果

集成建议

  1. 在人脸识别成功回调中使用:

    relayController.openRelayWithAutoClose();
    
  2. 在门禁控制逻辑中集成:

    // 配合UDP门禁控制使用
    if (isUDPInitialized && udpExample != null) {
        udpExample.handleFaceRecognitionSuccess(true);
    }
    // 同时控制本地继电器
    relayController.openRelayWithAutoClose();
    
  3. 在调试界面中添加手动控制:

    // 调试用的手动开门按钮
    btnManualOpen.setOnClickListener(v -> relayController.openRelay());
    btnManualClose.setOnClickListener(v -> relayController.closeRelay());
    

总结

新的 RelayController 类提供了您要求的三个核心功能:

  1. 开启继电器: openRelay() 方法
  2. 关闭继电器: closeRelay() 方法
  3. 开启继电器3秒后自动关闭: openRelayWithAutoClose() 方法

同时还提供了更多实用功能:状态读取、自定义延时、设备类型支持、完整的错误处理等。这个实现更加健壮、易用,适合在人脸识别门禁系统中使用。