package com.nodka.zysjtest; import android.app.ZysjSystemManager; import android.content.Context; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class GpioActivity extends BaseTestActivity { private static final String SERVICE_NOT_FOUND_MESSAGE = "未获取到 ZysjSystemManager 系统服务"; private ZysjSystemManager zysjSystemManager; @Override protected String getPageTitle() { return "GPIO 控制接口测试"; } @Override protected List getTestItems() { return Arrays.asList( new TestItem( "控制系统 GPIO 电平", "set_zysj_gpio_value", "which:GPIO 编号,value:0 表示低电平,1 表示高电平。", this::setZysjGpioValue, TestItem.InputField.number( "请输入 which:GPIO1 对应 1,GPIO2 对应 2", "2", "which"), TestItem.InputField.number( "请输入 value:0=低电平,1=高电平", "1", "value")), new TestItem( "获取系统 GPIO 状态", "get_zysj_gpio_value", "which:GPIO 编号,返回 0 表示低电平,1 表示高电平,-1 表示获取失败。", this::getZysjGpioValue, TestItem.InputField.number( "请输入 which:GPIO1 对应 1,GPIO2 对应 2", "2", "which")) ); } private ZysjSystemManager zysjSystemManager() { if (zysjSystemManager != null) { return zysjSystemManager; } for (String serviceName : getServiceNameCandidates()) { Object service = getSystemService(serviceName); if (service instanceof ZysjSystemManager) { zysjSystemManager = (ZysjSystemManager) service; return zysjSystemManager; } } throw new IllegalStateException(SERVICE_NOT_FOUND_MESSAGE); } private List getServiceNameCandidates() { List candidates = new ArrayList<>(); addContextFieldCandidate(candidates, "ZYSJ_SYSTEM_SERVICE"); addContextFieldCandidate(candidates, "ZYSJ_SERVICE"); candidates.add("zysj_system"); candidates.add("zysj"); candidates.add("zysj_system_service"); return candidates; } private void addContextFieldCandidate(List candidates, String fieldName) { try { Field field = Context.class.getField(fieldName); Object value = field.get(null); if (value instanceof String && !candidates.contains(value)) { candidates.add((String) value); } } catch (NoSuchFieldException ignored) { } catch (IllegalAccessException e) { throw new IllegalStateException("读取 Context." + fieldName + " 失败", e); } } private String setZysjGpioValue(TestItem item, String[] inputs) { int which = parseInt(inputs, 0, 1, Integer.MAX_VALUE, "which 必须是大于 0 的 GPIO 编号"); int value = parseInt(inputs, 1, 0, 1, "value 只能是 0 或 1"); int result = zysjSystemManager().set_zysj_gpio_value(which, value); if (result == 0) { return "调用成功:set_zysj_gpio_value(" + which + ", " + value + ") 返回值:0,设置成功"; } else if (result == -1) { return "调用成功:set_zysj_gpio_value(" + which + ", " + value + ") 返回值:-1,设置失败"; } return "调用成功:set_zysj_gpio_value(" + which + ", " + value + ") 返回值:" + result; } private String getZysjGpioValue(TestItem item, String[] inputs) { int which = parseInt(inputs, 0, 1, Integer.MAX_VALUE, "which 必须是大于 0 的 GPIO 编号"); int result = zysjSystemManager().get_zysj_gpio_value(which); if (result == 0) { return "调用成功:get_zysj_gpio_value(" + which + ") 返回值:0,低电平"; } else if (result == 1) { return "调用成功:get_zysj_gpio_value(" + which + ") 返回值:1,高电平"; } else if (result == -1) { return "调用成功:get_zysj_gpio_value(" + which + ") 返回值:-1,获取失败"; } return "调用成功:get_zysj_gpio_value(" + which + ") 返回值:" + result; } private int parseInt(String[] inputs, int index, int minValue, int maxValue, String errorMessage) { if (index >= inputs.length) { throw new IllegalArgumentException(errorMessage); } try { int value = Integer.parseInt(inputs[index].trim()); if (value < minValue || value > maxValue) { throw new IllegalArgumentException(errorMessage); } return value; } catch (NumberFormatException e) { throw new IllegalArgumentException(errorMessage); } } }