6 SDK开发指南

1 SDK概述

本章介绍SDK的定义和组成,帮助用户更好的了解SDK。

1.1 SDK 简介

ED-AIC3000-120系列Camera的SDK是一组软件工具开发包(Software Development Kit),给用户提供上层应用所需的接口,便于对Camera进行二次开发。

ED-AIC3000-120系列Camera的SDK功能包含Trigger/Tune按键的定义、12-Pin M12接口中的DI的定义、激光开关的控制、状态指示灯的控制、报警指示灯的控制、2路DO的控制、RGB灯光和灯源的控制。

SDK在整个Camera系统中的位置如下图所示。

1.2 SDK组成

Camera的SDK是由多个头文件和库文件组成的,具体文件名和安装路径如下表。

功能类型文件类型文件名安装路径
IO控制头文件eda-io.h/usr/include/eda/
库文件libeda_io.so/usr/lib/
动态库文件libedaio.so/usr/lib/python3/dist-packages/
Camera Sensor控制开源库picamear2picamera2用户手册

在开发过程中用户可以根据实际需要实现的功能,参考下文对应的功能代码来完成上层应用的开发。

2 功能说明

本章介绍各项功能对应代码的编写方法,帮助用户编写上层应用所需要的代码。

2.1 IO控制(C++)

本节介绍指示灯控制、激光控制、事件监听和输出控制等的具体操作。

2.1.1 流程图

2.1.2 获取实例并初始化

在操作IO前需要先获取IO实例并对实例进行初始化,操作步骤如下。

  1. 获取IO实例。

eda::EdaIo *em = eda::EdaIo::getInstance();

  1. 对实例进行初始化。

em->setup();

2.1.3 事件回调

IO控制支持对事件注册回调函数,包含注册Input信息、注册Trigger按键和注册Tune按键。

  • DI1触发事件

em->registerInput(trigger_input);

12-Pin M12接口中的COMMON_IN引脚接地,DI1引脚接5V触发

  • 注册Trigger按键

em->registerTrigger(trigger_trigger);

  • 注册Tune按键

em->registerTune(trigger_tune);

举例:

#include "eda/eda-io.h"
void trigger_input(int b){
    printf("[Test] Tirgger input: %d\n", b);
}
int main(int argc, char *argv[]){
    eda::EdaIo *em = eda::EdaIo::getInstance();
    em->registerInput(trigger_input);
    em->setup();
    ....
}

2.1.4 控制IO状态

通过IO来控制激光的开/关、状态指示灯的点亮/熄灭、报警指示灯的点亮/熄灭和2路输出信号的使能/禁用。

前提条件:

已完成实例的初始化。

操作说明:

  • 控制激光

em->openLaser();

em->closeLaser();

  • 控制状态指示灯

em->setScanStat(true);

em->setScanStat(false);

  • 控制警报指示灯

em->openAlarm();

em->openAlarm();

  • 控制2路输出信号

em->setDo1High(false);

em->setDo2High(false);

2.1.5 控制灯光

Camera侧面灯和区域灯均可独立控制。

前提条件:

已完成实例的初始化。

操作说明:

  • 控制侧灯颜色

    em->setRgbLight(1);

    • 0: 关闭
    • 1: 红色
    • 2: 绿色
    • 3: 蓝色
    • 4: 黄色
    • 5: 白光
  • 控制灯源

    • 使能(默认状态为使能)

    em->enableLightSection(1);

    取值范围为1~4,分别对应不同的分区

    • 禁用

    em->disableLightSection(1);

    取值范围为1~4,分别对应不同的分区

灯源的使能/禁用不是打开/关闭灯源,灯源与摄像头是联动的,只有当灯源已使能且摄像头打开的条件下灯源才会亮。

2.1.6 代码示例

IO控制Class(C++语言)

typedef void (*IoTrigger)(int level);

class EdaIo{
public:
    static EdaIo* getInstance();
    static void close_io();
    ~EdaIo();
    /**
     * @brief 打开激光
     * 
     */
    void openLaser();
    /**
     * @brief 关闭激光
     * 
     */
    void closeLaser();
    /**	
     * @brief 设置状态指示灯
     * 
     * @param good 
     */
    void setScanStat(bool good);
    /**
     * @brief 打开alarm 指示灯
     * 
     */
    void openAlarm();
    /**
     * @brief 关闭alarm 指示灯
     * 
     */
    void closeAlarm();
    /**
     * @brief
     *
     * @param section 1~4
     * @return int
     */
    int enableLightSection(int section);
    /**
     * @brief
     *
     * @param section 1~4
     * @return int
     */
    int disableLightSection(int section);
    /**
     * @brief 设置output1 输出 [高/低]
     * 
     * @param high 
     */
    void setDo1High(bool high);
    /**
     * @brief 设置output2 输出 [高/低]
     * 
     * @param high 
     */
    void setDo2High(bool high);
    // void setAimerColor(RGBColor color);
    /**
     * @brief 注册input触发回调函数
     * 
     * @param callback 
     */
    void registerInput(IoTrigger callback);
    /**
     * @brief 注册register按键 回调函数
     * 
     * @param callback 
     */
    void registerTrigger(IoTrigger callback);
    /**
     * @brief 注册Tune按键 回调函数
     * 
     * @param callback 
     */
    void registerTune(IoTrigger callback);
    /**
     * @brief set RGB light
     *
     * @param light 0: Close; 1: Red; 2: Green; 3: Blue,
     * @return int
     */
    void setRgbLight(uint8_t light);
    /**
     * @brief Set the RGB Light
     * 
     * @param r red
     * @param g green
     * @param b blue
     */
    void setup();
};

2.2 IO控制(Python)

本节介绍指示灯控制、激光控制、事件监听和输出控制等的具体操作。

2.2.1 流程图

2.2.2 导入模块

在操作IO前需要先导入模块。

from libedaio import EdaIo,registerInput,registerTrigger,registerTune

2.2.3 获取实例并初始化

在操作IO前需要先获取IO实例并对实例进行初始化,操作步骤如下。

  1. 获取IO实例。

eda = EdaIo.singleton();

  1. 对实例进行初始化。

eda.setup();

2.2.3 事件回调

IO控制支持对事件注册回调函数,包含注册Input信息、注册Trigger按键和注册Tune按键。

  • DI1触发事件

registerInput(func_input);

12-Pin M12接口中的COMMON_IN引脚接地,DI1引脚接5V触发

  • 注册Trigger按键

registerTrigger(func_trigger);

  • 注册Tune按键

registerTune(func_tune);

举例:

#!/usr/bin/python3
from libedaio import EdaIo,registerInput
def func_input(v):
    print("[Debug] Trigger: input!", v)
def main() -> int:
    eda = EdaIo.singleton()
    registerInput(func_input)
    eda.setup()

if __name__ == "__main__":
    main()

2.2.5 控制IO

通过IO来控制激光的开/关、状态指示灯的点亮/熄灭、报警指示灯的点亮/熄灭和2路输出信号的使能/禁用。

前提条件:

已完成实例的初始化。

操作说明:

  • 控制激光

eda.openLaser();

eda.closeLaser();

  • 控制状态指示灯

eda.setScanStat(true);

eda.setScanStat(false);

  • 控制警报指示灯

eda.openAlarm();

eda.openAlarm();

  • 控制2路输出信号

eda.setDo1High(false);

eda.setDo2High(false);

2.2.6 控制灯光

Camera侧面灯和区域灯均可独立控制。

前提条件:

已完成实例的初始化。

操作说明:

  • 控制侧灯颜色

    eda.setRgbLight(1);

    • 0: 关闭
    • 1: 红色
    • 2: 绿色
    • 3: 蓝色
    • 4: 黄色
    • 5: 白光
  • 控制灯源

    • 使能(默认状态为使能)

    eda.enableLightSection(1);

    取值范围为1~4,分别对应不同的分区

    • 禁用

    eda.disableLightSection(1);

    取值范围为1~4,分别对应不同的分区

灯源的使能/禁用不是打开/关闭灯源,灯源与摄像头是联动的,只有当灯源已使能且摄像头打开的条件下灯源才会亮。

2.2.7 代码示例

IO控制(Python3)

from libedaio import EdaIo,registerInput,registerTrigger,registerTune

def func_trigger(v):
    print("[Debug] Trigger: trigger button!", v)
  
...
eda = EdaIo.singleton(); # 获取IO控制实例
registerTrigger(func_trigger); # 注册Trigger 按键回调
# registerInput(func_trigger); # 注册Input输入回调
# registerTune(func_trigger); # 注册Tune 按键回调
eda.setup(); # 初始化
...
eda.openLaser(); # 打开激光
# eda.closeLaser(); # 关闭激光
eda.setScanStat(True); #  设置状态指示灯
eda.openAlarm(); # 打开警告指示灯
# eda.closeAlarm(); # 关闭警告指示灯
eda.setDo1High(True); # 设置第一路输出
eda.setDo2High(False); # 设置第二路输出
eda.setRgbLight(1); # 设置侧灯,0: 关闭; 1: 红色; 2: 绿色; 3: 蓝色 4: 黄色 5: 白色

### 2.3 Camera Sensor控制示例

Camera Sensor控制软件基于开源库`picamera2`,官方资料<a href="https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf" target="_blank">Picamera2 Manual</a>,以下是一些简单的说明和示例。

#### 2.3.2 操作步骤

在操作Camera之前,需要先导入IO模块再获取IO实例并初始化(具体操作参见[2.2.2 导入模块](#_2-2-2-导入模块)和[2.2.3 获取实例并初始化](#_2-2-3-获取实例并初始化)),再进行如下操作。

1. 导入模块

​	`from picamera2 import Picamera2, Preview`

2. 获取Camera实例

​	`picam2 = Picamera2()`

2. 创建预览配置

​	`preview_config = picam2.create_preview_configuration()`

3. 应用预览配置

​	`picam2.configure(preview_config)`

4. 启动摄像头预览功能,NULL表示不在屏幕上显示画面

​	`picam2.start_preview(Preview.NULL)`

5. 打开摄像头

​	`picam2.start()`

6. 捕获图片

​	`picam2.capture_file("test.jpg")`

8. 关闭摄像头

​	`picam2.close()`

## 3 示例

本章介绍具体的操作示例,包含编写代码、编译代码和运行代码。

### 3.1 编写代码

下文以实现“打开摄像头等待2s后捕获一张图片”的功能为例,使用Python行编写代码。

编写的内容如下:

```py
from picamera2 import Picamera2, Preview  # 导入 Picamera2 库及预览功能
import time  # 导入时间模块,用于延时操作

picam2 = Picamera2()  # 创建 Picamera2 对象实例
camera_config = picam2.create_preview_configuration()  # 创建相机的预览配置
picam2.configure(camera_config)  # 配置相机
picam2.start_preview(Preview.NULL)  # 启动相机的预览功能(此处选择 NULL 预览,表示没有窗口显示)
picam2.start()  # 开启相机
time.sleep(2)  # 等待 2 秒,确保相机稳定
picam2.capture_file("test.jpg")  # 捕获照片并保存到当前目录,文件名为 "test.jpg"
picam2.close()  # 关闭相机,释放资源

编写完成后,保存为test123.py文件。

提示

文件名自定义即可。

3.2 运行代码

Python代码编写完成后需要登录Camera设备,在Raspberry Pi系统上运行。

前提条件:

  • 已完成Camera的硬件部分的连线,具体的操作请参见启动设备
  • 已将Camera上电并正常接入网络。
  • 已获取Camera IP地址,并成功登录Camera系统。

操作步骤:

在Camera系统上创建一个文件夹,将章节3.1 编写代码中编写的代码文件上传至文件夹中。

执行ls命令,查看文件夹中的文件,确保代码文件已上传成功。

  1. 执行如下命令,运行代码。
sudo python test123.py

提示

运行成功后,可在代码文件所在的目录下查看到test.jpg文件。