lzh
3 days ago 9e3ee0fb3332f604000c20863cece6a09ad23f90
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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<TestItem> 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<String> getServiceNameCandidates() {
        List<String> 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<String> 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);
        }
    }
}