主要内容

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插件示例显示commandIDS在LCDAddon.mClassdef文件为:

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类中的命令标识符必须与commandIDS用于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';结束

另请参阅

|