Skip to content

Commit de96b33

Browse files
J-M-Whitebanchan86glopesdev
authored
Add documentation with DocFX (#6)
* Add consistent naming in Trigger-Recording example workflow * Use backticks (`) to highlight all package names. * Update link to the remote command server page in the SpikeGLX manual. * Add example workflow for DigitalOutput * Add package README file --------- Co-authored-by: Shawn Tan <banchan@gmail.com> Co-authored-by: glopesdev <g.lopes@neurogears.org>
1 parent c7c4f4c commit de96b33

21 files changed

+430
-78
lines changed

.bonsai/Bonsai.config

Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,26 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<PackageConfiguration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
33
<Packages>
4-
<Package id="Bonsai" version="2.8.5" />
5-
<Package id="Bonsai.Core" version="2.8.5" />
6-
<Package id="Bonsai.Design" version="2.8.5" />
7-
<Package id="Bonsai.Editor" version="2.8.5" />
4+
<Package id="Bonsai" version="2.9.0" />
5+
<Package id="Bonsai.Core" version="2.9.0" />
6+
<Package id="Bonsai.Design" version="2.9.0" />
7+
<Package id="Bonsai.Editor" version="2.9.0" />
8+
<Package id="DockPanelSuite" version="3.1.1" />
9+
<Package id="DockPanelSuite.ThemeVS2015" version="3.1.1" />
810
<Package id="jacobslusser.ScintillaNET" version="3.6.3" />
9-
<Package id="Markdig" version="0.18.1" />
10-
<Package id="Microsoft.Web.WebView2" version="1.0.1823.32" />
11+
<Package id="Markdig" version="0.41.1" />
12+
<Package id="Microsoft.Web.WebView2" version="1.0.2792.45" />
1113
<Package id="Rx-Core" version="2.2.5" />
1214
<Package id="Rx-Interfaces" version="2.2.5" />
1315
<Package id="Rx-Linq" version="2.2.5" />
1416
<Package id="Rx-PlatformServices" version="2.2.5" />
15-
<Package id="SvgNet" version="3.3.3" />
16-
<Package id="System.Buffers" version="4.5.1" />
17-
<Package id="System.Memory" version="4.5.5" />
18-
<Package id="System.Numerics.Vectors" version="4.5.0" />
17+
<Package id="SvgNet" version="3.5.0" />
18+
<Package id="System.Buffers" version="4.6.0" />
19+
<Package id="System.Memory" version="4.6.0" />
20+
<Package id="System.Numerics.Vectors" version="4.6.0" />
1921
<Package id="System.Resources.Extensions" version="8.0.0" />
20-
<Package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" />
21-
<Package id="YamlDotNet" version="13.1.1" />
22+
<Package id="System.Runtime.CompilerServices.Unsafe" version="6.1.0" />
23+
<Package id="YamlDotNet" version="16.3.0" />
2224
</Packages>
2325
<AssemblyReferences>
2426
<AssemblyReference assemblyName="Bonsai" />
@@ -27,33 +29,35 @@
2729
<AssemblyReference assemblyName="Bonsai.Editor" />
2830
</AssemblyReferences>
2931
<AssemblyLocations>
30-
<AssemblyLocation assemblyName="Bonsai" processorArchitecture="MSIL" location="Packages/Bonsai.2.8.5/lib/net48/Bonsai.exe" />
31-
<AssemblyLocation assemblyName="Bonsai.Core" processorArchitecture="MSIL" location="Packages/Bonsai.Core.2.8.5/lib/net462/Bonsai.Core.dll" />
32-
<AssemblyLocation assemblyName="Bonsai.Design" processorArchitecture="MSIL" location="Packages/Bonsai.Design.2.8.5/lib/net462/Bonsai.Design.dll" />
33-
<AssemblyLocation assemblyName="Bonsai.Editor" processorArchitecture="MSIL" location="Packages/Bonsai.Editor.2.8.5/lib/net472/Bonsai.Editor.dll" />
34-
<AssemblyLocation assemblyName="Markdig" processorArchitecture="MSIL" location="Packages/Markdig.0.18.1/lib/net40/Markdig.dll" />
35-
<AssemblyLocation assemblyName="Microsoft.Web.WebView2.Core" processorArchitecture="MSIL" location="Packages/Microsoft.Web.WebView2.1.0.1823.32/lib/net45/Microsoft.Web.WebView2.Core.dll" />
36-
<AssemblyLocation assemblyName="Microsoft.Web.WebView2.WinForms" processorArchitecture="MSIL" location="Packages/Microsoft.Web.WebView2.1.0.1823.32/lib/net45/Microsoft.Web.WebView2.WinForms.dll" />
37-
<AssemblyLocation assemblyName="Microsoft.Web.WebView2.Wpf" processorArchitecture="MSIL" location="Packages/Microsoft.Web.WebView2.1.0.1823.32/lib/net45/Microsoft.Web.WebView2.Wpf.dll" />
32+
<AssemblyLocation assemblyName="Bonsai" processorArchitecture="MSIL" location="Packages/Bonsai.2.9.0/lib/net48/Bonsai.exe" />
33+
<AssemblyLocation assemblyName="Bonsai.Core" processorArchitecture="MSIL" location="Packages/Bonsai.Core.2.9.0/lib/net472/Bonsai.Core.dll" />
34+
<AssemblyLocation assemblyName="Bonsai.Design" processorArchitecture="MSIL" location="Packages/Bonsai.Design.2.9.0/lib/net472/Bonsai.Design.dll" />
35+
<AssemblyLocation assemblyName="Bonsai.Editor" processorArchitecture="MSIL" location="Packages/Bonsai.Editor.2.9.0/lib/net472/Bonsai.Editor.dll" />
36+
<AssemblyLocation assemblyName="Markdig" processorArchitecture="MSIL" location="Packages/Markdig.0.41.1/lib/net462/Markdig.dll" />
37+
<AssemblyLocation assemblyName="Microsoft.Web.WebView2.Core" processorArchitecture="MSIL" location="Packages/Microsoft.Web.WebView2.1.0.2792.45/lib/net462/Microsoft.Web.WebView2.Core.dll" />
38+
<AssemblyLocation assemblyName="Microsoft.Web.WebView2.WinForms" processorArchitecture="MSIL" location="Packages/Microsoft.Web.WebView2.1.0.2792.45/lib/net462/Microsoft.Web.WebView2.WinForms.dll" />
39+
<AssemblyLocation assemblyName="Microsoft.Web.WebView2.Wpf" processorArchitecture="MSIL" location="Packages/Microsoft.Web.WebView2.1.0.2792.45/lib/net462/Microsoft.Web.WebView2.Wpf.dll" />
3840
<AssemblyLocation assemblyName="ScintillaNET" processorArchitecture="MSIL" location="Packages/jacobslusser.ScintillaNET.3.6.3/lib/net40/ScintillaNET.dll" />
39-
<AssemblyLocation assemblyName="SVG" processorArchitecture="MSIL" location="Packages/SvgNet.3.3.3/lib/net462/SVG.dll" />
40-
<AssemblyLocation assemblyName="System.Buffers" processorArchitecture="MSIL" location="Packages/System.Buffers.4.5.1/lib/net461/System.Buffers.dll" />
41-
<AssemblyLocation assemblyName="System.Memory" processorArchitecture="MSIL" location="Packages/System.Memory.4.5.5/lib/net461/System.Memory.dll" />
42-
<AssemblyLocation assemblyName="System.Numerics.Vectors" processorArchitecture="MSIL" location="Packages/System.Numerics.Vectors.4.5.0/lib/net46/System.Numerics.Vectors.dll" />
41+
<AssemblyLocation assemblyName="SVG" processorArchitecture="MSIL" location="Packages/SvgNet.3.5.0/lib/net462/SVG.dll" />
42+
<AssemblyLocation assemblyName="System.Buffers" processorArchitecture="MSIL" location="Packages/System.Buffers.4.6.0/lib/net462/System.Buffers.dll" />
43+
<AssemblyLocation assemblyName="System.Memory" processorArchitecture="MSIL" location="Packages/System.Memory.4.6.0/lib/net462/System.Memory.dll" />
44+
<AssemblyLocation assemblyName="System.Numerics.Vectors" processorArchitecture="MSIL" location="Packages/System.Numerics.Vectors.4.6.0/lib/net462/System.Numerics.Vectors.dll" />
4345
<AssemblyLocation assemblyName="System.Reactive.Core" processorArchitecture="MSIL" location="Packages/Rx-Core.2.2.5/lib/net45/System.Reactive.Core.dll" />
4446
<AssemblyLocation assemblyName="System.Reactive.Interfaces" processorArchitecture="MSIL" location="Packages/Rx-Interfaces.2.2.5/lib/net45/System.Reactive.Interfaces.dll" />
4547
<AssemblyLocation assemblyName="System.Reactive.Linq" processorArchitecture="MSIL" location="Packages/Rx-Linq.2.2.5/lib/net45/System.Reactive.Linq.dll" />
4648
<AssemblyLocation assemblyName="System.Reactive.PlatformServices" processorArchitecture="MSIL" location="Packages/Rx-PlatformServices.2.2.5/lib/net45/System.Reactive.PlatformServices.dll" />
4749
<AssemblyLocation assemblyName="System.Resources.Extensions" processorArchitecture="MSIL" location="Packages/System.Resources.Extensions.8.0.0/lib/net462/System.Resources.Extensions.dll" />
48-
<AssemblyLocation assemblyName="System.Runtime.CompilerServices.Unsafe" processorArchitecture="MSIL" location="Packages/System.Runtime.CompilerServices.Unsafe.4.5.3/lib/net461/System.Runtime.CompilerServices.Unsafe.dll" />
49-
<AssemblyLocation assemblyName="YamlDotNet" processorArchitecture="MSIL" location="Packages/YamlDotNet.13.1.1/lib/net47/YamlDotNet.dll" />
50+
<AssemblyLocation assemblyName="System.Runtime.CompilerServices.Unsafe" processorArchitecture="MSIL" location="Packages/System.Runtime.CompilerServices.Unsafe.6.1.0/lib/net462/System.Runtime.CompilerServices.Unsafe.dll" />
51+
<AssemblyLocation assemblyName="WeifenLuo.WinFormsUI.Docking" processorArchitecture="MSIL" location="Packages/DockPanelSuite.3.1.1/lib/net40/WeifenLuo.WinFormsUI.Docking.dll" />
52+
<AssemblyLocation assemblyName="WeifenLuo.WinFormsUI.Docking.ThemeVS2015" processorArchitecture="MSIL" location="Packages/DockPanelSuite.ThemeVS2015.3.1.1/lib/net40/WeifenLuo.WinFormsUI.Docking.ThemeVS2015.dll" />
53+
<AssemblyLocation assemblyName="YamlDotNet" processorArchitecture="MSIL" location="Packages/YamlDotNet.16.3.0/lib/net47/YamlDotNet.dll" />
5054
</AssemblyLocations>
5155
<LibraryFolders>
52-
<LibraryFolder path="Packages/Microsoft.Web.WebView2.1.0.1823.32/runtimes/win-arm64/native" platform="arm64" />
53-
<LibraryFolder path="Packages/Microsoft.Web.WebView2.1.0.1823.32/runtimes/win-arm64/native_uap" platform="arm64" />
54-
<LibraryFolder path="Packages/Microsoft.Web.WebView2.1.0.1823.32/runtimes/win-x64/native" platform="x64" />
55-
<LibraryFolder path="Packages/Microsoft.Web.WebView2.1.0.1823.32/runtimes/win-x64/native_uap" platform="x64" />
56-
<LibraryFolder path="Packages/Microsoft.Web.WebView2.1.0.1823.32/runtimes/win-x86/native" platform="x86" />
57-
<LibraryFolder path="Packages/Microsoft.Web.WebView2.1.0.1823.32/runtimes/win-x86/native_uap" platform="x86" />
56+
<LibraryFolder path="Packages/Microsoft.Web.WebView2.1.0.2792.45/runtimes/win-arm64/native" platform="arm64" />
57+
<LibraryFolder path="Packages/Microsoft.Web.WebView2.1.0.2792.45/runtimes/win-arm64/native_uap" platform="arm64" />
58+
<LibraryFolder path="Packages/Microsoft.Web.WebView2.1.0.2792.45/runtimes/win-x64/native" platform="x64" />
59+
<LibraryFolder path="Packages/Microsoft.Web.WebView2.1.0.2792.45/runtimes/win-x64/native_uap" platform="x64" />
60+
<LibraryFolder path="Packages/Microsoft.Web.WebView2.1.0.2792.45/runtimes/win-x86/native" platform="x86" />
61+
<LibraryFolder path="Packages/Microsoft.Web.WebView2.1.0.2792.45/runtimes/win-x86/native_uap" platform="x86" />
5862
</LibraryFolders>
5963
</PackageConfiguration>

docs/README.md

Lines changed: 8 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,17 @@
1-
# Bonsai.SpikeGLX
2-
[Bonsai](http://bonsai-rx.org/) package for interfacing with [SpikeGLX](https://billkarsh.github.io/SpikeGLX/).
1+
# Bonsai - SpikeGLX
2+
`Bonsai.SpikeGLX` is a [Bonsai](https://bonsai-rx.org/) package for interfacing with the [SpikeGLX](https://billkarsh.github.io/SpikeGLX/) recording software for [Neuropixels](https://www.neuropixels.org/) probes.
33

44
## Description
5-
Bonsai.SpikeGLX is designed to allow integration of SpikeGLX recordings into Bonsai workflows. This package provides the ability to
6-
- stream neural and non-neural data from SpikeGLX into Bonsai in real-time,
7-
- set digital outputs on an NI device in use by SpikeGLX, and
8-
- start and stop SpikeGLX recordings.
9-
10-
## Getting Started
11-
### Starting the SpikeGLX Remote Command Server
12-
Bonsai.SpikeGLX requires SpikeGLX's remote command server to be running. See the [SpikeGLX-CPP-SDK Getting Started](https://github.com/billkarsh/SpikeGLX-CPP-SDK/blob/main/GettingStarted.txt) page for how to do this. Each Bonsai.SpikeGLX marble requires the IP address and port of the SpikeGLX command server to work.
13-
14-
### Streaming SpikeGLX Data into Bonsai
15-
Bonsai.SpikeGLX provides two ways to access data from SpikeGLX once an acquisition is running:
16-
- **SpikeFetch** will fetch a fixed-size buffer of the latest data from SpikeGLX whenever it receives an input signal (or at a fixed interval if no input is provided).
17-
- **SpikeStream** will continuously stream data in fixed-size buffers from SpikeGLX.
18-
19-
The key difference between the two is that unlike SpikeFetch, SpikeStream will never skip or repeat elements in the buffers it emits. This is demonstrated below, where both marbles have been used to stream a 1Hz sinewave in 1s buffers. The output of SpikeFetch 'jumps' around as it misses or repeats samples, whereas the output of SpikeStream does not.
20-
21-
![SpikeFetch-vs-SpikeStream-Timed](https://github.com/FeeLab/Bonsai.SpikeGLX/assets/120409412/24fda4b8-fa1c-4089-8dee-a33c9126eed7)
22-
23-
### Setting Digital Outputs
24-
The **DigitalOutput** marble may be used to control digital outputs on an NI DAQ system in use by SpikeGLX.
25-
26-
### Controlling SpikeGLX Recordings
27-
SpikeGLX recordings may be started and stopped using the **TriggerRecording** marble, which can increment/decrement the gate and trigger values in SpikeGLX. It takes a tuple of two integers, which modify the gate and trigger, respectively, in the following way:
28-
- -1: No change
29-
- 0: Set low
30-
- 1: Increment and set high
31-
32-
As of SpikeGLX Release v20230815-phase30, adding a fixed period of saved data before and after triggering for context is not implemented for remote triggering. An alternative is to use TTL controlled start and stop, with a digital output (controlled using the **DigitalOutput** marble) as the TTL signal.
5+
`Bonsai.SpikeGLX` is designed to allow integration of SpikeGLX recordings into Bonsai workflows. This package provides the ability to:
6+
- stream neural and non-neural data from SpikeGLX into Bonsai in real-time;
7+
- set digital outputs on an NI device in use by SpikeGLX; and
8+
- start and stop SpikeGLX recordings.
339

3410
## Authors
35-
Bonsai.SpikeGLX is developed by Jacob White of the [Fee Lab](https://feelaboratory.org/) at MIT.
36-
37-
## Version History
38-
-0.1
39-
- Initial Release
11+
`Bonsai.SpikeGLX` was initially developed by Jacob White of the [Fee Lab](https://feelaboratory.org/) at MIT.
4012

4113
## License
42-
Use is subject to [MIT](https://opensource.org/license/mit/) license terms.
14+
`Bonsai.SpikeGLX` is released as open source under the [MIT License](https://licenses.nuget.org/MIT).
4315

4416
SpikeGLX-CPP-SDK components are subject to [Janelia Research Campus Software Copyright 1.2 license](http://license.janelia.org/license) terms.
4517

46-
## Acknowledgments
47-
The SpikeStream marble is inspired by the AudioCapture marble in [Bonsai.Audio](https://github.com/bonsai-rx/bonsai/tree/main/Bonsai.Audio).
48-
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
uid: Bonsai.SpikeGLX.DigitalOutput
3+
---
4+
5+
[!include[DigitalOutput](~/articles/spikeglx-digitaloutput.md)]
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
uid: Bonsai.SpikeGLX.Fetch
3+
---
4+
5+
[!include[Fetch](~/articles/spikeglx-fetch.md)]
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
uid: Bonsai.SpikeGLX.Trigger
3+
---
4+
5+
> [!WARNING]
6+
> [`Trigger`](xref:Bonsai.SpikeGLX.Trigger) works only with SpikeGLX runs configured to use **remote controlled start and stop** triggering.
7+
[!include[Trigger](~/articles/spikeglx-trigger.md)]

docs/articles/getting-started.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# Getting Started
2+
`Bonsai.SpikeGLX` is a [Bonsai](https://bonsai-rx.org/) package for interfacing with the [SpikeGLX](https://billkarsh.github.io/SpikeGLX/) recording software for [Neuropixels](https://www.neuropixels.org/).
3+
4+
It is designed to supplement the core functionalities of SpikeGLX (*i.e.*, visualizing and saving data) and facilitate more complex experimental paradigms (*e.g.*, closed-loop neurofeedback, brain-computer interfaces, *etc.*).
5+
6+
`Bonsai.SpikeGLX` provides three ways of interacting with an ongoing SpikeGLX run:
7+
- streaming data from SpikeGLX into Bonsai with [`Fetch`];
8+
- controlling SpikeGLX digital output lines with [`DigitalOutput`]; and
9+
- starting and stopping recordings with [`Trigger`].
10+
11+
A brief summary of the functionality of each of these operators is provided here. A more detailed description of each may be found on the associated Reference page.
12+
13+
> [!NOTE]
14+
> All `Bonsai.SpikeGLX` operators require SpikeGLX's remote command server to be running. A full description of how to do this can be found in the [SpikeGLX User Manual](https://billkarsh.github.io/SpikeGLX/Sgl_help/UserManual.html#remote-command-servers). Make sure to note the `Host` (IP Address) and `Port` the command server is listening on. These are properties that must be set for each `Bonsai.SpikeGLX` operator.
15+
16+
## Stream Data from SpikeGLX
17+
[!include[Fetch](~/articles/spikeglx-fetch.md)]
18+
19+
## Control Digital Outputs
20+
[!include[DigitalOutput](~/articles/spikeglx-digitaloutput.md)]
21+
22+
## Save Data
23+
SpikeGLX is expressly designed for saving Neuropixels data. As a result, it is recommended to use SpikeGLX's built-in capabilities to save your data; however, `Bonsai.SpikeGLX` provides ways to control which parts of a run SpikeGLX should save. If a SpikeGLX run is configured to use "remote controlled start and stop" triggering, [`Trigger`] may be used to set gate and trigger values.
24+
25+
[!include[Trigger](~/articles/spikeglx-trigger.md)]
26+
27+
> [!NOTE]
28+
> SpikeGLX also provides the ability to trigger recordings using a TTL line. In some cases, this may be preferred over using [`Trigger`].
29+
30+
If you do wish to save data you have streamed into Bonsai using [`Fetch`], you can use the [`MatrixWriter`] operator from the `Bonsai.Dsp` package.
31+
32+
<!--Reference Style Links -->
33+
[`Fetch`]: xref:Bonsai.SpikeGLX.Fetch
34+
[`DigitalOutput`]: xref:Bonsai.SpikeGLX.DigitalOutput
35+
[`Trigger`]: xref:Bonsai.SpikeGLX.Trigger
36+
[`Timer`]: xref:Bonsai.Reactive.Timer
37+
[`MatrixWriter`]: xref:Bonsai.Dsp.MatrixWriter
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
uid: spikeglx-digitaloutput
3+
title: DigitalOutput
4+
---
5+
6+
[`DigitalOutput`] writes a logical value to one or more digital output lines on a NI-DAQ device in use by SpikeGLX. Digital lines are specified in the `Channels` property as a comma separated list, (*e.g.*, `Dev6/port0/line2,Dev6/port0/line5`).
7+
8+
For example, the below workflow toggles a digital line between high and low every second.
9+
:::workflow
10+
![DigitalOutput](../workflows/GettingStarted-DigitalOutput.bonsai)
11+
:::
12+
13+
> [!WARNING]
14+
> Unlike `Bonsai.DAQmx`'s [`DigitalOutput`](xref:Bonsai.DAQmx.DigitalOutput), `Bonsai.SpikeGLX`'s [`DigitalOutput`] writes **the same** logical value to all of its channels.
15+
16+
<!--Reference Style Links -->
17+
[`DigitalOutput`]: xref:Bonsai.SpikeGLX.DigitalOutput

docs/articles/spikeglx-fetch.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
uid: spikeglx-fetch
3+
title: Fetch
4+
---
5+
6+
[`Fetch`] samples data from an ongoing SpikeGLX run. Data are sampled from one or more channels of a single SpikeGLX data stream. Data are emitted in a sample buffer, where each row corresponds to a channel, and each column to a sample from each of the channels. The order of the channels follows the order in which you specify the channels in the `Channels` property.
7+
8+
If no input source is specified, data is emitted asynchronously every time a new buffer is filled.
9+
:::workflow
10+
![Unsubscribed Fetch](~/workflows/GettingStarted-UnsubscribedFetch.bonsai)
11+
:::
12+
13+
Alternatively, if an input observable sequence is provided, a new data buffer is emitted every time a new notification is emitted by the input source.
14+
:::workflow
15+
![Subscribed Fetch](~/workflows/GettingStarted-SubscribedFetch.bonsai)
16+
:::
17+
18+
<!--Reference Style Links -->
19+
[`Fetch`]: xref:Bonsai.SpikeGLX.Fetch

docs/articles/spikeglx-trigger.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
uid: spikeglx-trigger
3+
title: Trigger
4+
---
5+
6+
[`Trigger`] takes as input a `Tuple` of two values, which modify the gate and trigger, respectively, in the following way:
7+
- -1: No change
8+
- 0: Set low
9+
- 1: Increment and set high
10+
11+
For example, the below workflow starts a new gate immediately, and then toggles the trigger every five seconds. This results in SpikeGLX saving five-second periods of the run every ten seconds.
12+
:::workflow
13+
![Trigger](../workflows/GettingStarted-Trigger.bonsai)
14+
:::
15+
16+
<!--Reference Style Links -->
17+
[`Trigger`]: xref:Bonsai.SpikeGLX.Trigger

docs/articles/toc.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
- name: Introduction
2+
href: ../index.md
3+
- name: Getting Started
4+
href: getting-started.md

0 commit comments

Comments
 (0)