> Translate NI-DAQmx C function signatures into correct calldaqlib MATLAB calls. Use when the user mentions calldaqlib, any DAQmx* C function name (DAQmxCfgSampClkTiming, DAQmxExportSignal, DAQmxSetStartTrigRetriggerable, DAQmxGetSampClkRate, etc.), or needs NI-DAQmx functionality not exposed by become return values, buffer-size args, enum-as-string), multi-task semantics, start() clobber, device-level empty-daq workaround, dictionary returns, string getter placeholder, array getter placeholder. shared timebase, export signal, connect terminals, external sample clock, trigger configuration, NI driver, C function translation.
npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill matlab-call-nidaqmx
Translate NI-DAQmx C signatures into correct calldaqlib MATLAB calls on
Data Acquisition Toolbox R2026a+.
calldaqlib or a specific DAQmx* C functionexport signal, reference triggers, enhanced alias rejection, digital filters)
dq.Rate,addtrigger, addclock, addinput, read, write, start, stop)
DAQmxCreateTask or DAQmxLoadTask (these cannot work throughcalldaqlib — it owns task creation internally)
Did the user explicitly mention calldaqlib or a specific DAQmx C function?
daq object. They have a reason (driver debugging, matching C code, capability
gap, learning). Skip to Step 2.
Can the daq object property/method do this? (dq.Rate, addtrigger,
addclock, addinput, dq.NumScansAvailable, etc.)
driver-level diagnostics or a capability outside daq object coverage.
Does the C function lack a taskHandle parameter (device-level API)?
DAQmxGetDevIsSimulated, DAQmxGetDevAISupportedMeasTypes:Use an empty daq object (no channels added). Pass the device name as an
argument. Returns a plain scalar or array, not a dictionary.
DAQmxCreateTask, DAQmxLoadTask: These do not workthrough calldaqlib at all (calldaqlib owns task creation internally).
DAQmxConnectTerms, DAQmxDisconnectTerms: Use an **emptydaq object** (same as device-level queries). These work on X-series devices.
Does the daq object have multiple internal task handles (e.g., AI + DIO)?
task warns. Read the dictionary key you care about. Acceptable.
separate daq objects (loses synchronized start/stop).
Is this a getter returning a string or array?
char *data, uInt32 bufferSize in C): Pass "" thenbufferSize. Example: calldaqlib(dq, "DAQmxGetSampClkSrc", "", 256)
int32 data[], uInt32 arraySize in C): Passzeros(1,N,'type') then N. Example:
calldaqlib(dq, "DAQmxGetDevAISupportedMeasTypes", "Dev1", zeros(1,32,'int32'), 32)
Does any argument correspond to a C int32 enum slot?
"DAQmx_Val_RisingSlope" not int32(10280).Both work, but strings are self-documenting and prevent silent wrong-enum bugs.
references/enum-constants.md for the 15 most-used enum names.Six distinct patterns cover all calldaqlib usage:
dq = daq("ni");
addinput(dq, "Dev1", "ai0", "Voltage");
calldaqlib(dq, "DAQmxCfgSampClkTiming", "/Dev1/PFI0", 5000, ...
"DAQmx_Val_Rising", "DAQmx_Val_FiniteSamps", uint64(1000));
calldaqlib(dq, "DAQmxSetStartTrigRetriggerable", true);
result = calldaqlib(dq, "DAQmxGetSampClkRate");
rate = result("Dev1_ai0");
Returns a dictionary keyed by channel name — even on single-channel objects.
result = calldaqlib(dq, "DAQmxGetSampClkSrc", "", 256);
source = result("Dev1_ai0");
The "" is required as a placeholder for the char *data output slot.
bufferSize follows immediately. Use 256 for short names, 1024 for long paths.
dEmpty = daq("ni");
result = calldaqlib(dEmpty, "DAQmxGetDevAISupportedMeasTypes", ...
"Dev1", zeros(1, 32, "int32"), 32);
measTypes = result(result ~= 0);
Pre-allocate a typed buffer (zeros(1,N,'int32')) matching the C signature's
array type. Filter unused slots with result(result ~= 0).
dEmpty = daq("ni");
isSim = calldaqlib(dEmpty, "DAQmxGetDevIsSimulated", "Dev1");
Use an empty daq (no channels added). Pass device name as argument.
Returns a plain scalar (not a dictionary).
Also works for terminal routing on X-series devices:
dEmpty = daq("ni");
calldaqlib(dEmpty, "DAQmxConnectTerms", "/Dev1/PFI0", "/Dev1/PFI1", "DAQmx_Val_DoNotInvertPolarity");
calldaqlib(dEmpty, "DAQmxDisconnectTerms", "/Dev1/PFI0", "/Dev1/PFI1");
| C argument | calldaqlib equivalent |
|---|---|
| TaskHandle taskHandle | Omit — daq object owns it |
| const char source[] | MATLAB string "/Dev1/PFI0" |
| float64 rate | MATLAB double |
| int32 activeEdge (enum) | Enum name string "DAQmx_Val_Rising" |
| uInt64 sampsPerChan | uint64(1000) |
| bool32 data (input) | true / false |
| float64 *data (output scalar) | Becomes return value (dictionary) |
| int32 *data (output scalar) | Becomes return value (dictionary) |
| char *data, uInt32 bufferSize (output pair) | Pass "" + bufferSize |
| int32 data[], uInt32 arraySize (output array) | Pass zeros(1,N,'int32') + N |
| Any getter return | Always a dictionary keyed by DevN_chanName |
NI tasks; both get the call. For getters with a channel arg, ignore the
warning from the irrelevant task and read the dictionary key you want.
For setters targeting one measurement type, split into separate daq objects.
getters: pass "" before bufferSize. Array getters: pass
zeros(1,N,'type') before arraySize.
start()reapplies dq.Rate to the driver. If you set rate via
DAQmxCfgSampClkTiming then call start(), it snaps back to dq.Rate.
Fix: set dq.Rate first, use calldaqlib only for parameters the daq
object does not track. Alternative: use DAQmxStartTask/DAQmxStopTask
via calldaqlib to bypass the daq object's commit pass entirely.
"DAQmx_Val_RisingSlope" notint32(10280). Strings are readable and prevent wrong-enum bugs. The
error on a bad string is misleading ("Value must be of type int32") —
it means the string wasn't recognized, not that you should pass an int.
no taskHandle (like DAQmxGetDevIsSimulated,
DAQmxGetDevAISupportedMeasTypes) work only when the daq object has no
channels. Create dEmpty = daq("ni") and pass the device name as an arg.
DAQmxCreateTask and DAQmxLoadTask cannot work through calldaqlib.These functions create a new task — calldaqlib already owns task creation
internally. DAQmxConnectTerms/DAQmxDisconnectTerms DO work via an
empty daq object on X-series devices (same pattern as device-level queries).
expected errors. To set the same property on multiple channels, loop.
produces no error until start().
10. Trigger support is per-device. Not all devices support all trigger
types. Error -200077 lists the supported enum values — read it.
11. All task-level getter results return a dictionary. Keyed by
DevN_chanName. Never expect a bare scalar. Use result("Dev1_ai0")
or iterate keys(result).
12. Buffer-size too small returns NI Error -200228. The error message
includes "Required Buffer Size in Bytes: N" — parse it and retry with N.
Heuristic: 256 for short names, 1024 for long paths/channel lists.
13. Array getters return a fixed-size buffer. Filter unused trailing
zeros with result(result ~= 0).
dq.Rate before using calldaqlib for timing config"" before bufferSize for string gettersDAQmx_Val_FiniteSamps — it does not work with ContSampsDAQmxGetSampClkRate) not generic attribute getters (DAQmxGetTimingAttribute)references/hot-signatures.md — 20 most-used calldaqlib signatures by categoryreferences/enum-constants.md — 15 DAQmx_Val_* enum name stringsreferences/common-mistakes.md — Mistakes from discovery trials and customer usage----
Copyright 2026 The MathWorks, Inc.
----
Guide users through a structured workflow for co-authoring documentation. Use when user wants to write documentation, proposals, technical specs, decision docs, or similar structured content. This workflow helps users efficiently transfer context, refine content through iteration, and verify the doc works for readers. Trigger when user mentions writing docs, creating proposals, drafting specs, or similar documentation tasks.
Automatically creates user-facing changelogs from git commits by analyzing commit history, categorizing changes, and transforming technical commits into clear, customer-friendly release notes. Turns hours of manual changelog writing into minutes of automated generation.
Use when implementing any feature or bugfix, before writing implementation code
Use when you have a spec or requirements for a multi-step task, before touching code
Use when creating new skills, editing existing skills, or verifying skills work before deployment
Use when writing or improving README files. Not all READMEs are the same — provides templates and guidance matched to your audience and project type.
| Remove signs of AI-generated writing from text. Use when editing or reviewing text to make it sound more natural and human-written. Based on Wikipedia's inflated symbolism, promotional language, superficial -ing analyses, vague attributions, em dash overuse, rule of three, AI vocabulary words, negative parallelisms, and excessive conjunctive phrases.
Official Opentrons Protocol API for OT-2 and Flex robots. Use when writing protocols specifically for Opentrons hardware with full access to Protocol API v2 features. Best for production Opentrons protocols, official API compatibility. For multi-vendor automation or broader equipment control use pylabrobot.
Take matlab/matlab-call-nidaqmx from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.