6.2. PikaStdDevice 标准设备

PikaStdDevice 是一个抽象的设备模型,提供了跨平台的统一外设 API 。

6.2.1. 安装

  • 在 requestment.txt 中加入 PikaStdDevice 的依赖。

PikaStdDevice
  • 运行 pikaPackage.exe

6.2.2. 为什么要有标准设备模块

什么是标准设备模块呢?我们先从其他的脚本技术说起,比如 MicroPython,并没有统一的外设调用 API,这使得用户在使用不同的平台时,都需要重新学习 API,比如下面这个是 MicroPython 在 STM32F4 平台驱动 GPIO 的代码。

_images/1638495380966-02a52d33-9986-401c-a7e1-136ce71ad53e.webp

这个是 ESP8266 的

_images/1638495381179-e6afcca5-7f32-4a2f-a531-10f6b106db15.webp

可以明显看到在选择 pin 的管脚时,一个用的是字符串,而另一个用的是整型数,控制电平时,一个使用 high()low()方法,而另一个使用on()off()方法,总之驱动的API标准很混乱。 有没有什么办法,能够统一外设的 API,使得用户只需要熟悉一套 API,就能够在任意平台通用呢? 方法是有的,就是 PikaStdDevice 标准设备驱动模块。

6.2.3. 模块结构

_images/image-20221207125315706.png

  • PikaStdDevice 模块提供了 GPIOIICPWM 等基础的外设 Python 模块。

  • PikaStdDevice 基于 pika_hal 设备抽象层,pika_hal是一个纯 c 语言的设备抽象层,将不同平台的外设操作都统一为相同的 APIPikaStdDevice 调用,这样不同的平台 (STM32、ESP32、BL602) 等都可以使用通用的 Python 代码来控制设备了。

  • pika_hal 设备抽象层需要在不同的平台进行适配 (Platform Port),通过在不同的平台重写形如 pika_hal_platform_xxxx()WEAK 函数,就可以为不同的平台提供支持。

  • 除了 PikaStdDevice 模块之外,还有一些 sensor / motorPython 模块,也基于 pika_hal 开发,这些模块使用的是 pika_halGPIOIICPWM 等适配好的功能,所以只需要适配好 pika_hal就可以使用。

关于 pika_hal 的详细介绍

6.2.4. PikaStdDevice 模块示例

以 GPIO 模块为例,以下是 PikaStdDevice 定义的用户 API

class GPIO:
    def __init__(self):
        pass

    def init(self):
        pass

    def setPin(self, pinName: str):
        pass

    def setId(self, id: int):
        pass

    def getId(self) -> int:
        pass

    def getPin(self) -> str:
        pass

    def setMode(self, mode: str):
        pass

    def getMode(self) -> str:
        pass

    def setPull(self, pull: str):
        pass

    def enable(self):
        pass

    def disable(self):
        pass

    def high(self):
        pass

    def low(self):
        pass

    def read(self) -> int:
        pass

PikaStdDevice 模块的示例代码在 https://gitee.com/Lyon1998/pikapython/tree/master/examples/Device 路径下,示例中的 machine 模块是 PikaStdDevice 模块的简单重命名。