MATLAB插件类
MATLAB®类必须继承自matlabshared.addon.LibraryBase
类:
classdefMyAddon < matlabshared.addon.LibraryBase…结束
请注意
在MATLAB类中,类名、包名、函数名、脚本名和变量名只使用ASCII字符。
的matlabshared.addon.LibraryBase
类包含各种属性和方法。下图显示了您的附加组件的典型类继承:
要实现你的MATLAB插件类,你必须重写以下属性和方法:
根据外接程序的设计,您可能还需要重写以下属性和方法:
命令标识符
命令标识符,通常命名commandID
,为8位16进制值。的commandID
用于sendCommand
属性的一致映射commandHandler方法中的c++头文件.
使用以下语法指定commandID
属性在你的MATLAB类:
ADDON_OPERATION = hex2dec(cmdID)…结束
的创建LCD插件示例显示commandID
S在LCDAddon.m
Classdef文件为:
LCD_CREATE = hex2dec(Access = private, Constant = true)“00”LCD_INITIALIZE = hex2dec(“01”LCD_CLEAR = hex2dec(“2”) LCD_PRINT = hex2dec(“03”LCD_DELETE = hex2dec(“04”)结束
类似地,LCD.h
定义了commandID
史:
#define LCD_CREATE 0x00 #define LCD_INITIALIZE 0x01 #define LCD_CLEAR 0x02 #define LCD_PRINT 0x03 #define LCD_DELETE 0x04
请注意
为了保持行为一致,MATLAB类中的命令标识符必须与commandID
S用于commandHandler方法从c++头文件。
库规范
库规范定义了外接程序的名称以及所需的c++源文件和库的位置。库规范是一个属性,由下面的代码设置:
属性(Access = protected, Constant = true“MyAddonFolder / MyAddon”DependentLibraries = {} LibraryHeaderFiles = {} CppHeaderFile = fullfile(arduinoio. aspx)FilePath (mfilename (' fullpath ')),“src”,“MyAddon.h”CppClassName =“MyAddon”结束
五个库规范属性必须定义为matlabshared.addon.LibraryBase
或如下表所示。
财产 | 描述 |
---|---|
LibraryName |
作为字符串的外接程序库名称。该字符串使用与附加组件文件夹结构相同的语法: |
DependentLibraries |
作为字符串单元数组的外接程序所需的其他外接程序库。 |
LibraryHeaderFiles |
外接程序所需的任何c++头文件。看到LibraryBase有关包含头文件的详细信息。 |
CppHeaderFile |
作为字符串的加载项c++头文件的完整路径和名称。 |
CppClassName |
c++头文件中的类名,以字符串形式显示。 |
的创建LCD插件示例库显示了这些属性的典型命名:
属性(Access = protected, Constant = true“ExampleLCD / LCDAddon”DependentLibraries = {} LibraryHeaderFiles =“LiquidCrystal / LiquidCrystal.h”CppHeaderFile = fullfile(arduinoio. exe)FilePath (mfilename (' fullpath ')),“src”,“LCD.h”CppClassName =“液晶”结束
中指定的c++头文件LibraryHeaderFiles
,确保CppClassName
与头文件中定义的任何类的名称不相同。在这个例子中,液晶显示器
定义的c++类不同于LiquidCrystal.h
.
如果您的附加组件需要I2C
金宝app支持,那么
DependentLibraries = {“i2c”};
构造函数
加载项的构造函数必须以两种方式初始化加载项对象:
父加载项对象到Arduino®对象。
定义外接程序使用的硬件引脚集
下面是构造函数的最小形式:
方法函数obj = AddonName(parentObj) obj。父母=父母;结束...结束
通常,加载项构造函数会将加载项资源注册到父Arduino对象。类似地,还可以执行检查以确保外接程序不会产生资源使用冲突。中的构造函数。创建LCD插件示例显示了如何检查一个资源,然后获取,以防止两个LCD插件同时存在:
% InputPins是用户输入,包含连接LCD和arduino的引脚函数obj = LCDAddon(parentObj,varargin)如果matlabshared.hwsdk.internal.localizedError(MATLAB: narginchk: notEnoughInputs);结束试一试p = inputParser;addParameter (p,“RegisterSelectPin”[]);addParameter (p,“EnablePin”[]);addParameter (p,“DataPins”[]);解析(p,变长度输入宗量{1:结束});抓e throwAsCaller (e);结束obj。父母=父母;obj。RegisterSelectPin = p.Results.RegisterSelectPin;obj。EnablePin = p.Results.EnablePin;obj。DataPins = p.Results.DataPins;inputPins = [cellstr(obj.RegisterSelectPin) cellstr(obj.EnablePin) obj.DataPins];obj。Pins = inputPins; count = getResourceCount(obj.Parent,obj.ResourceOwner);因为这个例子只允许实现1个LCD% shield,如果资源计数大于0,则出错如果计数> 0错误(“你只能有一个液晶屏”);结束incrementResourceCount (obj.Parent obj.ResourceOwner);createLCD (obj inputPins);结束
析构函数
默认情况下,不需要为附加组件编写析构函数。的析构函数matlabshared.addon.LibraryBase
类被隐式调用。使用来自父Arduino对象的硬件资源或在c++头中分配内存的附加组件必须调用附加组件析构函数来释放这些资源。
警告
在创建外接程序的新实例期间,不释放析构函数中的资源可能会导致内存泄漏和失败。
附加组件类的析构函数必须:
方法的删除方法
matlabshared.addon.LibraryBase
类。在c++中执行一个命令commandHandler方法释放库使用的所有内存资源。
不抛出错误或异常。为防止在析构函数期间抛出错误或异常,将内容包装在
try - catch
声明。
的析构函数创建LCD插件示例显示如何安全检查和释放资源:
方法(Access = protected)函数删除(obj)试一试parentObj = obj.Parent;%清除已配置到LCD屏蔽的引脚inputPins = [cellstr(obj.RegisterSelectPin) cellstr(obj.EnablePin) obj.DataPins];为iLoop = inputPins configurePinResource(parentObj,iLoop{:},obj。ResourceOwner,“设置”);结束减少LCD的资源计数decrementResourceCount (parentObj obj.ResourceOwner);cmdID = obj.LCD_DELETE;输入= [];sendCommand (obj obj。LibraryName,cmdID, inputs);抓销毁时不抛出错误。这可能是由于施工不完整造成的。。结束结束结束
资源的所有权
您的外接程序可以选择性地指定某些惟一且不能共享的硬件资源。的创建LCD插件只能有一个实例,因为一次只能有一个LCD屏蔽连接到Arduino设备。
请注意
显式定义外接程序的硬件资源所有权可防止在运行时发生资源获取和使用冲突。
你可以在你的加载项类中通过下面的属性来指定资源的所有权:
property (Access = private) ResourceOwner = 'ExampleLCD/LCDAddon';结束