TA的每日心情 | 无聊 2020-4-14 13:20 |
---|
签到天数: 37 天 连续签到: 1 天 [LV.5]常住居民I
|
本帖最后由 孤胆枪手_A 于 2019-1-7 02:58 编辑
写了一点代码感觉太麻烦了,因为我发现对传感器的操作无非就是这几步:- 创建(初始化)
- 读取传感器的数据
- 判断数据在那个范围
- 根据数据所在范围进行操作
所以我把重复性操作的方法抽象出一个类,方便使用。
APeriphera类里有这么多内容,下面我一一解释。大神勿喷。首先类继承于TimerTask 类
- /**
- * 阈值最小值
- */
- public double min;
- /**
- * 当前值
- */
- public double value;
- /**
- * 最大值
- */
- public double max;
- /**
- * 要显示的名字
- */
- public String name;
复制代码 这四个属性好解释,一个最小值,一个最大值,一个值储存当前值,一个是名字。名字可以是名称,也可以是单位,反正你开心就好。
为什么要用double类型的数值呢,因为毕竟是有非整数的传感器数据,比如温度,要用整型的话强转一下就可以了
- /**
- * 构造方法 只有一个形参:名字 其他的形参从配置文件里读,如果读不到,最小值设置为10,最大值设置为20
- *
- * @param name
- * @throws IOException
- */
- public APeripheral(String name) throws IOException {
- this.name = name;
- String minString = KeyValueStorage.getValue(Config.CONFIG_PATH, formatMinName());
- String maxString = KeyValueStorage.getValue(Config.CONFIG_PATH, formatMaxName());
- this.min = minString == null ? 10 : Integer.valueOf(minString);
- this.max = maxString == null ? 20 : Integer.valueOf(maxString);
- // 写入阈值到配置文件
- KeyValueStorage.setValue(Config.CONFIG_PATH, formatMinName(), min + "");
- KeyValueStorage.setValue(Config.CONFIG_PATH, formatMaxName(), max + "");
- }
- /**
- * 构造方法
- *
- * @param name 外设的名称
- * @param min 阈值最小值
- * @param max 阈值最大值
- * @throws IOException 写入配置文件异常
- */
- public APeripheral(String name, double min, double max) throws IOException {
- this.min = min;
- this.max = max;
- this.name = name;
- // 写入阈值到配置文件
- KeyValueStorage.setValue(Config.CONFIG_PATH, formatMinName(), min + "");
- KeyValueStorage.setValue(Config.CONFIG_PATH, formatMaxName(), max + "");
- }
复制代码 提供两个构造,第一个只有名字这个参数,最大值和最小值从配置文件里读,读不到就使用默认值
第二个构造可以传入名字,最大值和最小值,以上两个构造处理完成后都会把两个阈值写到配置文件里, 下次上电就可以直接读取。至于怎么写,随你发挥喽。
- /**
- * 小于最小值
- */
- abstract void lessThan();
- /**
- * 等于最小值
- */
- abstract void lessThanMinimum();
- /**
- * 最大值和最小值之间
- */
- abstract void betweenTheMaximumAndTheMinimum();
- /**
- * 等于最大值
- */
- abstract void equivalentToMaximum();
- /**
- * 大于最大值
- */
- abstract void greaterThanMaximum();
复制代码 这几个没有实现的方法是继承这个类的类需要实现的,因为这是在传感器数值满足上述条件时调用的方法。
- /**
- * 判断逻辑,根据当前值所处的范围来进入不同的方法
- */
- private void action() {
- if (this.value < this.min) {
- lessThan();
- } else if (this.value == this.min) {
- lessThanMinimum();
- } else if (this.value > this.min && this.value < this.max) {
- betweenTheMaximumAndTheMinimum();
- } else if (this.value == this.max) {
- equivalentToMaximum();
- } else {
- greaterThanMaximum();
- }
- }
复制代码 如果你没有需求,不要重写 action这个方法。这里就是判断当前值在什么范围内,通过范围调用的对应的方法。
- abstract public void doW();
复制代码 doW这个方法写当前类需要重复循环的代码,比如读数据啊,刷新oled啊,随你。。。。
- @Override
- public void run() {
- action();
- doW();
- }
复制代码 因为这个抽象类实现了Runnable接口,所以我在这里实现了run方法,利用死循环来重复执行这段代码,其中里面调用了两个方法,一个是action,用来判断当前传感器的数值在哪个范围;另一个是doW,就是自定义的代码,注意要在这个方法里更新value,也就是传感器的数值。(仿佛可以再封装一步?)
- /**
- * 设置当前值
- *
- * @param value
- */
- public void setValue(double value) {
- this.value = value;
- }
- /**
- * 获得当前值
- *
- * @return
- */
- public double getValue() {
- return value;
- }
- /**
- * 获得最小值
- *
- * @return
- */
- public double getMin() {
- return min;
- }
- /**
- * 设置最小值
- *
- * @param min 最小值
- * @throws IOException 写入配置文件的异常
- */
- public void setMin(double min) throws IOException {
- this.min = min;
- KeyValueStorage.setValue(Config.CONFIG_PATH, formatMinName(), min + "");
- }
- /**
- * 获得当前对象的最大值
- *
- * @return
- */
- public double getMax() {
- return max;
- }
- /**
- * 设置当前对象的最大值
- *
- * @param max 最大值
- * @throws IOException 写入配置文件的异常
- */
- public void setMax(double max) throws IOException {
- this.max = max;
- KeyValueStorage.setValue(Config.CONFIG_PATH, formatMaxName(), max + "");
- }
- /**
- * 获得当前的名字
- *
- * @return
- */
- public String getName() {
- return name;
- }
- /**
- * 设置当前的名字
- *
- * @param name
- */
- public void setName(String name) {
- this.name = name;
- }
复制代码 然后是所有属性的setter和getter。没什么好说的,就是在重新设置阈值的时候给配置文件更新一下新的阈值,毕竟这个程序突然断电可就直接停止工作了,没有剩余的时间处理,只能用这种笨办法来保存数据。
- @Override
- public String toString() {
- return String.format("%s:% 4f", this.name, this.value);
- }
复制代码 重写了toString方法,简单地设置为形如"名字:值"的字符串,这样显示给oled就直接调用toString就可以了。
- /**
- * 格式化储存在配置文件中的名字
- *
- * @return
- */
- private String formatMinName() {
- return this.name + "Min";
- }
- /**
- * 格式化储存在配置文件中的名字
- *
- * @return
- */
- private String formatMaxName() {
- return this.name + "Max";
- }
复制代码 最后就是这里要保存在配置文件中阈值的最大值和最小值,properties文件需要一个key,为了方便而且多个传感器不冲突,直接用名字加Min或Max来使用,这就要求创建类的时候,多个类的名字不能冲突,否则写入配置文件的阈值会覆盖。
PS:这里感谢TiJOS官方交流群里的血狂大佬提供的KeyValueStorage.java文件,这是写入Properties类的一个封装,方便读写配置文件。
---------------------------------------------------------------------------------------------------------------------------------------------
- public class BeanFactory {
- /**
- * 储存对象的map
- */
- public static Map<String, Object> beans = new HashMap<>();
-
- }
复制代码 另外我创建了一个工厂类,里面这个静态的hashMap是一个存放创建出来的对象的容器,方便拿取对象,不用作为参数传递给其他的外设类。
下面是个上述类使用的一个demo的源代码和TAPK文件,仅供参考......
demo.zip
(40.08 KB, 下载次数: 0)
|
|