查看: 1923|回复: 0

[原创] 钛极小龟——封装了一个传感器抽象类

[复制链接]
  • TA的每日心情
    无聊
    2020-4-14 13:20
  • 签到天数: 37 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2018-12-15 01:03:07 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 孤胆枪手_A 于 2019-1-7 02:58 编辑

    写了一点代码感觉太麻烦了,因为我发现对传感器的操作无非就是这几步:
    • 创建(初始化)
    • 读取传感器的数据
    • 判断数据在那个范围
    • 根据数据所在范围进行操作

    所以我把重复性操作的方法抽象出一个类,方便使用。
    QQ截图20181215001306.png
    APeriphera类里有这么多内容,下面我一一解释。大神勿喷。首先类继承于TimerTask 类
    1.         /**
    2.          * 阈值最小值
    3.          */
    4.         public double min;

    5.         /**
    6.          * 当前值
    7.          */
    8.         public double value;

    9.         /**
    10.          * 最大值
    11.          */
    12.         public double max;

    13.         /**
    14.          * 要显示的名字
    15.          */
    16.         public String name;
    复制代码
    这四个属性好解释,一个最小值,一个最大值,一个值储存当前值,一个是名字。名字可以是名称,也可以是单位,反正你开心就好。
    为什么要用double类型的数值呢,因为毕竟是有非整数的传感器数据,比如温度,要用整型的话强转一下就可以了
    1. /**
    2.          * 构造方法 只有一个形参:名字 其他的形参从配置文件里读,如果读不到,最小值设置为10,最大值设置为20
    3.          *
    4.          * @param name
    5.          * @throws IOException
    6.          */
    7.         public APeripheral(String name) throws IOException {

    8.                 this.name = name;

    9.                 String minString = KeyValueStorage.getValue(Config.CONFIG_PATH, formatMinName());
    10.                 String maxString = KeyValueStorage.getValue(Config.CONFIG_PATH, formatMaxName());

    11.                 this.min = minString == null ? 10 : Integer.valueOf(minString);
    12.                 this.max = maxString == null ? 20 : Integer.valueOf(maxString);
    13.                 // 写入阈值到配置文件
    14.                 KeyValueStorage.setValue(Config.CONFIG_PATH, formatMinName(), min + "");
    15.                 KeyValueStorage.setValue(Config.CONFIG_PATH, formatMaxName(), max + "");

    16.         }

    17.         /**
    18.          * 构造方法
    19.          *
    20.          * @param name 外设的名称
    21.          * @param min  阈值最小值
    22.          * @param max  阈值最大值
    23.          * @throws IOException 写入配置文件异常
    24.          */
    25.         public APeripheral(String name, double min, double max) throws IOException {
    26.                 this.min = min;
    27.                 this.max = max;
    28.                 this.name = name;
    29.                 // 写入阈值到配置文件
    30.                 KeyValueStorage.setValue(Config.CONFIG_PATH, formatMinName(), min + "");
    31.                 KeyValueStorage.setValue(Config.CONFIG_PATH, formatMaxName(), max + "");
    32.         }
    复制代码
    提供两个构造,第一个只有名字这个参数,最大值和最小值从配置文件里读,读不到就使用默认值
    第二个构造可以传入名字,最大值和最小值,以上两个构造处理完成后都会把两个阈值写到配置文件里, 下次上电就可以直接读取。至于怎么写,随你发挥喽。
    1. /**
    2.          * 小于最小值
    3.          */
    4.         abstract void lessThan();

    5.         /**
    6.          * 等于最小值
    7.          */
    8.         abstract void lessThanMinimum();

    9.         /**
    10.          * 最大值和最小值之间
    11.          */
    12.         abstract void betweenTheMaximumAndTheMinimum();

    13.         /**
    14.          * 等于最大值
    15.          */
    16.         abstract void equivalentToMaximum();

    17.         /**
    18.          * 大于最大值
    19.          */
    20.         abstract void greaterThanMaximum();
    复制代码
    这几个没有实现的方法是继承这个类的类需要实现的,因为这是在传感器数值满足上述条件时调用的方法。
    1. /**
    2.          * 判断逻辑,根据当前值所处的范围来进入不同的方法
    3.          */
    4.         private void action() {
    5.                 if (this.value < this.min) {
    6.                         lessThan();
    7.                 } else if (this.value == this.min) {
    8.                         lessThanMinimum();
    9.                 } else if (this.value > this.min && this.value < this.max) {
    10.                         betweenTheMaximumAndTheMinimum();
    11.                 } else if (this.value == this.max) {
    12.                         equivalentToMaximum();
    13.                 } else {
    14.                         greaterThanMaximum();
    15.                 }
    16.         }
    复制代码
    如果你没有需求,不要重写 action这个方法。这里就是判断当前值在什么范围内,通过范围调用的对应的方法。
    1.         abstract public void doW();
    复制代码
    doW这个方法写当前类需要重复循环的代码,比如读数据啊,刷新oled啊,随你。。。。
    1. @Override
    2.         public void run() {
    3.          action();
    4.          doW();
    5.         }
    复制代码
    因为这个抽象类实现了Runnable接口,所以我在这里实现了run方法,利用死循环来重复执行这段代码,其中里面调用了两个方法,一个是action,用来判断当前传感器的数值在哪个范围;另一个是doW,就是自定义的代码,注意要在这个方法里更新value,也就是传感器的数值。(仿佛可以再封装一步?)

    1.         /**
    2.          * 设置当前值
    3.          *
    4.          * @param value
    5.          */
    6.         public void setValue(double value) {
    7.                 this.value = value;
    8.         }

    9.         /**
    10.          * 获得当前值
    11.          *
    12.          * @return
    13.          */
    14.         public double getValue() {
    15.                 return value;
    16.         }

    17.         /**
    18.          * 获得最小值
    19.          *
    20.          * @return
    21.          */
    22.         public double getMin() {
    23.                 return min;
    24.         }

    25.         /**
    26.          * 设置最小值
    27.          *
    28.          * @param min 最小值
    29.          * @throws IOException 写入配置文件的异常
    30.          */
    31.         public void setMin(double min) throws IOException {
    32.                 this.min = min;
    33.                 KeyValueStorage.setValue(Config.CONFIG_PATH, formatMinName(), min + "");
    34.         }

    35.         /**
    36.          * 获得当前对象的最大值
    37.          *
    38.          * @return
    39.          */
    40.         public double getMax() {
    41.                 return max;
    42.         }

    43.         /**
    44.          * 设置当前对象的最大值
    45.          *
    46.          * @param max 最大值
    47.          * @throws IOException 写入配置文件的异常
    48.          */
    49.         public void setMax(double max) throws IOException {
    50.                 this.max = max;
    51.                 KeyValueStorage.setValue(Config.CONFIG_PATH, formatMaxName(), max + "");
    52.         }

    53.         /**
    54.          * 获得当前的名字
    55.          *
    56.          * @return
    57.          */
    58.         public String getName() {
    59.                 return name;
    60.         }

    61.         /**
    62.          * 设置当前的名字
    63.          *
    64.          * @param name
    65.          */
    66.         public void setName(String name) {
    67.                 this.name = name;
    68.         }
    复制代码
    然后是所有属性的setter和getter。没什么好说的,就是在重新设置阈值的时候给配置文件更新一下新的阈值,毕竟这个程序突然断电可就直接停止工作了,没有剩余的时间处理,只能用这种笨办法来保存数据。
    1. @Override
    2.         public String toString() {
    3.                 return String.format("%s:% 4f", this.name, this.value);
    4.         }
    复制代码
    重写了toString方法,简单地设置为形如"名字:值"的字符串,这样显示给oled就直接调用toString就可以了。
    1. /**
    2.          * 格式化储存在配置文件中的名字
    3.          *
    4.          * @return
    5.          */
    6.         private String formatMinName() {
    7.                 return this.name + "Min";
    8.         }

    9.         /**
    10.          * 格式化储存在配置文件中的名字
    11.          *
    12.          * @return
    13.          */
    14.         private String formatMaxName() {
    15.                 return this.name + "Max";
    16.         }
    复制代码
    最后就是这里要保存在配置文件中阈值的最大值和最小值,properties文件需要一个key,为了方便而且多个传感器不冲突,直接用名字加Min或Max来使用,这就要求创建类的时候,多个类的名字不能冲突,否则写入配置文件的阈值会覆盖。

    PS:这里感谢TiJOS官方交流群里的血狂大佬提供的KeyValueStorage.java文件,这是写入Properties类的一个封装,方便读写配置文件。
    ---------------------------------------------------------------------------------------------------------------------------------------------

    1. public class BeanFactory {
    2.         /**
    3.          * 储存对象的map
    4.          */
    5.         public static Map<String, Object> beans = new HashMap<>();
    6.         
    7. }
    复制代码
    另外我创建了一个工厂类,里面这个静态的hashMap是一个存放创建出来的对象的容器,方便拿取对象,不用作为参数传递给其他的外设类。

    下面是个上述类使用的一个demo的源代码和TAPK文件,仅供参考......

    demo.zip (40.08 KB, 下载次数: 0)
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-5-3 22:15 , Processed in 0.125691 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.