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控制 | 开源库 | picamear2 | picamera2用户手册 |
在开发过程中用户可以根据实际需要实现的功能,参考下文对应的功能代码来完成上层应用的开发。
2 功能说明
本章介绍各项功能对应代码的编写方法,帮助用户编写上层应用所需要的代码。
2.1 IO控制(C++)
本节介绍指示灯控制、激光控制、事件监听和输出控制等的具体操作。
2.1.1 流程图
2.1.2 获取实例并初始化
在操作IO前需要先获取IO实例并对实例进行初始化,操作步骤如下。
- 获取IO实例。
eda::EdaIo *em = eda::EdaIo::getInstance();
- 对实例进行初始化。
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实例并对实例进行初始化,操作步骤如下。
- 获取IO实例。
eda = EdaIo.singleton();
- 对实例进行初始化。
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
命令,查看文件夹中的文件,确保代码文件已上传成功。
- 执行如下命令,运行代码。
sudo python test123.py
test123.py
:表示章节3.1 编写代码中编写的代码文件。
提示
运行成功后,可在代码文件所在的目录下查看到test.jpg
文件。