通过Engee硬件支持包创建和使用自定义扩展
创建简单扩展的示例
让我们创建一个简单的自定义扩展。 要做到这一点,使用模板文件夹"模块",其中包含目录"设备"和"目标"。
-
*Device*是*不*与*Engee*模型交互并且不使用其数据的任意用户类。
-
Target*是一个用户类,它*与*Engee*模型交互,从中接收数据进行处理,并在另一个平台(微控制器,独立计算机等)上执行。).
在我们的例子中,我们将创建一个*设备*。
-
在"设备"文件夹中创建一个新的"演示"文件夹。
-
在"演示"中创建一个文件demo.py '用下面的代码:
import time
import datetime
from devices.base_device import BaseDevice
class Demo(BaseDevice):
def __init__(self) -> None:
pass
def __del__(self) -> None:
pass
def solve_equation(self, x: float, y: float, z: float) -> float:
return x * y - z
def get_host_time(self) -> str:
host_time = time.localtime()
return str(host_time)
这是一个简单设备的例子。 我们的’Demo’类可以计算具有指定参数的方程的结果,并将当前时间从客户端程序返回到*Engee*。
请注意,'Demo’类继承自’BaseDevice'。 这是硬件支持包将其注册为RPC类所必需的。 如果我们创建一个目标,我们将继承自"BaseTarget`:
from targets.base_target import BaseTarget
对于自定义RPC类,必须从`BaseDevice`(如果它是设备)或`BaseTarget`(如果它是目标)继承。 |
数据结构的转移
如果你想传输复杂的数据结构,那么在同一目录中创建一个`演示`文件`models.py `。 例如:
from devices.base_models import BaseModel
class MyStruct(BaseModel):
parameter_x: int
parameter_y: int
parameter_z: float
数据结构必须从`BaseModel’继承! |
然后,您可以在主类中使用此结构。:
from devices.demo.models import MyStruct
class Demo(BaseDevice):
...
def func(self, comp_s: MyStruct) -> float:
return comp_s.parameter_x + comp_s.parameter_y + comp_s.parameter_z
在Engee中注册和使用模块
创建Python模块后,您需要生成相应的Julia代码并在*Engee*中注册模块。
首先,让我们来看看现有设备的列表。:
engee> using Main.EngeeDeviceManager.Devices.
CAN COM ECHO HID
HTTP L502BOARD LOGITECHG29WHEEL MODBUSMASTER
SOCKET TFLEXDOCS THRUSTMASTERJOYSTICK THRUSTMASTERTHROTTLE
UM UTILS VISA
我们的’演示’模块还没有在这里。
指定我们的"模块"文件夹的路径并下载扩展名。:
engee> module_path = "/path/to/module"
engee> using Main.EngeeDeviceManager.Devices.UTILS
engee> using Main.EngeeDeviceManager.UTILS_API
engee> utils = UTILS.Utils()
engee> UTILS_API.loadExtension(utils, module_path)
如果一切都成功,客户端程序的日志中将出现以下消息:
INFO | Extension with name: module was loaded successfully!
模块现已注册。 重新启动*Engee*内核并重新启动硬件支持包:
engee> engee.clear_all()
# 等待内核重启
engee> engee.package.start("Engee-Device-Manager")
让我们再看看设备列表:
engee> using Main.EngeeDeviceManager.Devices.
CAN COM DEMO ECHO
HID HTTP L502BOARD LOGITECHG29WHEEL
MODBUSMASTER SOCKET TFLEXDOCS THRUSTMASTERJOYSTICK
THRUSTMASTERTHROTTLE UM UTILS VISA
"演示"模块现在在列表中,可以使用。:
engee> demo = DEMO.Demo()
Main.EngeeDeviceManager.Devices.DEMO.Demo("Demo", UUID("1ffb2334-3176-42ac-931e-c278af2506cb"), ["solve_equation", "get_host_time"], "Demo_1ffb2334-3176-42ac-931e-c278af2506cb_reply", Main.EngeeDeviceManager.Devices.DEMO.var"#solve_equation#3"{String, UUID}("Demo", UUID("1ffb2334-3176-42ac-931e-c278af2506cb")), Main.EngeeDeviceManager.Devices.DEMO.var"#get_host_time#4"{String, UUID}("Demo", UUID("1ffb2334-3176-42ac-931e-c278af2506cb")))
engee> demo.solve_equation(5.5, 6.6, 7.7)
28.599999999999998
engee> demo.get_host_time()
"time.struct_time(tm_year=2025, tm_mon=8, tm_mday=27, tm_hour=19, tm_min=32, tm_sec=52, tm_wday=2, tm_yday=239, tm_isdst=0)"
您的扩展将在每次运行客户端程序时自动加载。 如果您不再需要它,您可以从自动上传中删除它。:
engee> UTILS_API.deleteExtension(utils, module_path)
'DeleteExtension’函数从启动列表中删除扩展名。 要使更改生效,必须完全重新启动*Engee*硬件支持包。 |
因此,我们在*Engee*和自定义Python代码之间创建了一个"桥梁",在客户端程序上执行计算并在*Engee*中获得结果。